2016-07-06 3 views
0

У меня есть этот метод, который делает запрос PATCH на этот URL:BasicNetwork.performRequest: Неожиданный код ответа 400 для «URL» - Volley PATCH запрос

https://username.visualstudio.com/DefaultCollection/_apis/wit/workitems/8?api-version=1.0

Что делает этот метод делать: она обновляет workItem`s System.Title, который имеет идентификатор 8, в Microsoft Visual Studio - Team Foundation Server

public void testPostVolley(String url) { 
    /*Post data*/ 
    JSONArray jsonBody = new JSONArray(); 
    JSONObject jsonObject = new JSONObject(); 
    try { 
     jsonObject.put("op","replace"); 
     jsonObject.put("path","/fields/System.Title"); 
     jsonObject.put("value","Welcome to the jungle"); 
     jsonBody.put(jsonObject); 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 

    Log.d("JSON Array " , String.valueOf(jsonBody)); 

    JsonArrayRequest postRequest = new JsonArrayRequest(Request.Method.PATCH, url, 
      jsonBody, 
      new Response.Listener<JSONArray>() { 
       @Override 
       public void onResponse(JSONArray response) { 
        Log.d("Response Post Request", response.toString()); 
       } 
      }, 
      new Response.ErrorListener() { 
       @Override 
       public void onErrorResponse(VolleyError error) { 
        // Handle Error 
       } 
      }) { 
     @Override 
     public Map<String, String> getHeaders() throws AuthFailureError { 
      HashMap<String, String> headers = new HashMap<String, String>(); 
      headers.put("Authorization", MainRecyclerListView.TOKEN); 
      headers.put("Content-Type", "application/json-patch+json"); 

      return headers; 
     } 
    }; 
    queue.add(postRequest); 
} 

}

Я пытался в POSTMAN ш с теми же заголовками и тем же телом, и это работает, но в приложении для Android я получаю этот ответ:

07-06 13: 05: 49.253 2599-11381/ro.webivo.pockettask E/Volley: [209] BasicNetwork.performRequest: Неожиданный код ответа 400 для https://username.visualstudio.com/DefaultCollection/_apis/wit/workitems/8?api-version=1.0

Я вошел также тело I`m отправки и это одно:

07-06 13: 05: 49,017 2599-2599/ro.webivo.pockettask D/JSON Array: [{"op": "replace", "path": "/ fields/System.Title", "value": "Welcome to the jungle"}]

Официальный API для запроса PATCH здесь:

https://www.visualstudio.com/en-us/docs/integrate/api/wit/work-items

Не могли бы вы мне помочь? Это проблема Воллей?

Спасибо

+0

В корпусе ответа должно быть сообщение об ошибке, когда вы получаете «400-й запрос» из API-интерфейса VSTS Rest, можете ли вы проверить и передать сообщение тела? И аналогичный вопрос, связанный с Android Volley: http://salesforce.stackexchange.com/questions/50382/requestforupdate-always-returns-400 –

+0

Сообщение об ошибке в ответе VolleyError - это тот, который я вам дал. Вы знаете способ настройки ответа об ошибке? – dragosiv

+0

Итак, я попытался изменить Request.Method на POST и добавить разные заголовки, такие как: headers.put («X-HTTP-Method-Override», «PATCH») ;, и на этот раз я возвращал некоторые ответы от VSTS Службы отдыха говорят, что они принимают только Content-Type of application/json-patch + json. Я изменил его, но я снова получаю ответ 400 и ничего больше. Я попытался зарегистрировать файл error.networkresponse.data, но он имеет значение null. Есть идеи? – dragosiv

ответ

0

После двух дней поисков я нашел решение моей проблемы. Я просто изменил способ выполнения запроса PATCH. Я перешел из Volley в библиотеки HttpClient и HttpCore для этого запроса.

JSONArray jsonBody = new JSONArray(); 
JSONObject jsonObject = new JSONObject(); 

try { 
    jsonObject.put("op", "replace"); 
    jsonObject.put("path", "/fields/System.Title"); 
    jsonObject.put("value", title); 
    jsonBody.put(jsonObject); 
} catch (JSONException e) { 
    e.printStackTrace(); 
} 

HttpClient hc = new DefaultHttpClient(); 
String message; 

HttpPost updateResultsPost = new HttpPost(url); 


try { 
    message = jsonBody.toString(); 


    updateResultsPost.setEntity(new StringEntity(message, "UTF8")); 
    updateResultsPost.setHeader("Authorization", MainRecyclerListView.TOKEN); 
    updateResultsPost.setHeader("X-HTTP-Method-Override", "PATCH"); 
    updateResultsPost.setHeader("Content-type", "application/json-patch+json"); 
    HttpResponse resp = hc.execute(updateResultsPost); 
    if (resp != null && resp.getStatusLine().getStatusCode() == 200) { 
     String responseBody = EntityUtils.toString(resp.getEntity()); 
     JSONObject jsonUpdatedResponse = new JSONObject(responseBody); 
     Log.d("Status line", "" + String.valueOf(jsonUpdatedResponse)); 

    } 

} catch (UnsupportedEncodingException e) { 
    e.printStackTrace(); 
} catch (ClientProtocolException e) { 
    e.printStackTrace(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} catch (JSONException e) { 
    e.printStackTrace(); 
} 

Я надеюсь, что это поможет кому-то еще.

+0

Что делать, если сервер не поддерживает X-HTTP-метод-переопределение? –