2014-11-07 3 views
16

Постановка задачи:Android Volley - BasicNetwork.performRequest: Неожиданный код ответа 400

Я пытаюсь получить доступ к REST API, который возвращает объект JSON для различных кодов состояния HTTP (400, 403, 200 и т.д.) используя Volley.

Для любого HTTP-статуса, отличного от 200, кажется, что «неожиданный код ответа 400» является проблемой. Кто-нибудь есть способ обойти эту «ошибку»?

Код:

protected void getLogin() { 
    final String mURL = "https://somesite.com/api/login"; 

    EditText username = (EditText) findViewById(R.id.username); 
    EditText password = (EditText) findViewById(R.id.password); 

    // Post params to be sent to the server 
    HashMap<String, String> params = new HashMap<String, String>(); 
    params.put("username", username.getText().toString()); 
    params.put("password", password.getText().toString()); 

    JsonObjectRequest req = new JsonObjectRequest(mURL, new JSONObject(
      params), new Response.Listener<JSONObject>() { 
     @Override 
     public void onResponse(JSONObject response) { 

      try { 
       JSONObject obj = response 
         .getJSONObject("some_json_obj"); 

       Log.w("myApp", 
         "status code..." + obj.getString("name")); 

       // VolleyLog.v("Response:%n %s", response.toString(4)); 

      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
     } 
    }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 
      Log.w("error in response", "Error: " + error.getMessage()); 
     } 
    }); 

    // add the request object to the queue to be executed 
    AppController.getInstance().addToRequestQueue(req); 
} 
+0

У меня был символ «é» в моей строке запроса. Работал после того, как я закодировал все мои параметры. – Kiran

ответ

1

Просто обновить все, после некоторых обсуждений, я решил использовать Async Http Client вместо этого, чтобы решить мою более раннюю проблему. Библиотека позволяет использовать более чистый подход (для меня) для управления ответами HTTP, особенно в тех случаях, когда объекты JSON возвращаются во всех сценариях/состояниях HTTP.

protected void getLogin() { 

    EditText username = (EditText) findViewById(R.id.username); 
    EditText password = (EditText) findViewById(R.id.password); 

    RequestParams params = new RequestParams(); 
    params.put("username", username.getText().toString()); 
    params.put("password", password.getText().toString()); 

    RestClient.post(getHost() + "api/v1/auth/login", params, 
      new JsonHttpResponseHandler() { 

     @Override 
     public void onSuccess(int statusCode, Header[] headers, 
       JSONObject response) { 

      try { 

       //process JSONObject obj 
       Log.w("myapp","success status code..." + statusCode); 

      } catch (JSONException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 

     @Override 
     public void onFailure(int statusCode, Header[] headers, 
       Throwable throwable, JSONObject errorResponse) { 
      Log.w("myapp", "failure status code..." + statusCode); 


      try { 
       //process JSONObject obj 
       Log.w("myapp", "error ..." + errorResponse.getString("message").toString()); 
      } catch (JSONException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
    }); 
} 
1

Вы имеете в виду, что хотите получить коды статуса?

VolleyError имеет тип переменной переменной NetworkResponse и является общедоступным.

Вы можете получить доступ к error.networkResponse.statusCode для кода ошибки http.

Я надеюсь, что это полезно для вас.

5

Попробуйте это ...

StringRequest sr = new StringRequest(type,url, new Response.Listener<String>() { 
     @Override 
     public void onResponse(String response) { 

      // valid response 
     } 
    }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 
      // error 
     } 
    }){ 

@Override 
    protected Map<String,String> getParams(){ 
     Map<String,String> params = new HashMap<String, String>(); 
      params.put("username", username); 
      params.put("password", password); 
      params.put("grant_type", "password"); 
     return params; 
    } 

    @Override 
    public Map<String, String> getHeaders() throws AuthFailureError { 
     Map<String,String> params = new HashMap<String, String>(); 
     // Removed this line if you dont need it or Use application/json 
     // params.put("Content-Type", "application/x-www-form-urlencoded"); 
     return params; 
    } 
+0

что было большое спасибо – HPbyP

9
@Override 
public Map<String, String> getHeaders() throws AuthFailureError { 
    HashMap<String, String> headers = new HashMap<String, String>(); 
    headers.put("Content-Type", "application/json; charset=utf-8"); 
    return headers; 
} 

Вам нужно добавить Content-Type в заголовке.

+0

пересылка получить запрос. api работает нормально, но получение BasicNetwork.performRequest: Неожиданный код ответа 500. – JosephM

+0

@HemsLodha 500 - Внутренняя ошибка сервера «Общее сообщение об ошибке, заданное при возникновении непредвиденного состояния и не более подходящее сообщение». Это проблема на сервере. – Malder

+0

Обнаружена аналогичная ошибка, но мой был «Неожиданным кодом ответа 415». У меня было приложение Content-Type/json, но после добавления charset = utf-8 проблема исчезла. –

23

Один из способов сделать это без изменения исходного кода Volley «s является проверка данных ответа в VolleyError и разобрать его вашу собственную личность.

От f605da3 commit, Volley throws a ServerError exception, который содержит отклик сырой сети.

Так что вы можете сделать что-то похожее на это в вашей ошибки слушателя:

/* import com.android.volley.toolbox.HttpHeaderParser; */ 
public void onErrorResponse(VolleyError error) { 

    // As of f605da3 the following should work 
    NetworkResponse response = error.networkResponse; 
    if (error instanceof ServerError && response != null) { 
     try { 
      String res = new String(response.data, 
         HttpHeaderParser.parseCharset(response.headers, "utf-8")); 
      // Now you can use any deserializer to make sense of data 
      JSONObject obj = new JSONObject(res); 
     } catch (UnsupportedEncodingException e1) { 
      // Couldn't properly decode data to string 
      e1.printStackTrace(); 
     } catch (JSONException e2) { 
      // returned data is not JSONObject? 
      e2.printStackTrace(); 
     } 
    } 
} 

Для будущего, если Volley изменения, можно следовать выше подход, когда вам нужно проверить VolleyError для необработанных данных, которая была отправляется сервером и анализирует его.

Я надеюсь, что они реализуют это TODO, упомянутое в source file.

2

У меня тоже такая же ошибка, но в моем случае я звонил url с пустыми местами.

Тогда я исправил его, разыгрывая, как показано ниже.

String url = "Your URL Link"; 

url = url.replaceAll(" ", "%20"); 

StringRequest stringRequest = new StringRequest(Request.Method.GET, url, 
          new com.android.volley.Response.Listener<String>() { 
           @Override 
           public void onResponse(String response) { 
           ... 
           ... 
           ... 
+1

Спасибо! Это решит мою проблему в Android 4.4.2 – sebasira

Смежные вопросы