2014-11-07 7 views
16

समस्या बयान:एंड्रॉयड वॉली - BasicNetwork.performRequest: अप्रत्याशित प्रतिक्रिया कोड 400

मैं एक REST API का है कि विभिन्न HTTP स्थिति कोड के लिए एक JSON ऑब्जेक्ट वापस आ जाएगी का उपयोग करने की कोशिश कर रहा हूँ (400, 403, 200 आदि) वॉली का उपयोग करना

200 से अधिक किसी भी HTTP स्थिति के लिए, ऐसा लगता है कि 'अप्रत्याशित प्रतिक्रिया कोड 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 क्लाइंट का उपयोग करने का निर्णय लिया है। पुस्तकालय HTTP प्रतिक्रियाओं में हेरफेर करने के लिए एक क्लीनर दृष्टिकोण (मुझे) की अनुमति देता है, विशेष रूप से उन मामलों में जहां JSON ऑब्जेक्ट्स सभी परिदृश्यों/HTTP स्थितियों में लौटाए जाते हैं। Volley के स्रोत कोड को बदले बिना ऐसा करने का

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 है और यह सार्वजनिक है।

आप http त्रुटि कोड के लिए error.networkResponse.statusCode एक्सेस कर सकते हैं।

मुझे आशा है कि यह आपके लिए सहायक होगा।

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; 
} 

आप शीर्षक के सामग्री प्रकार जोड़ने की जरूरत है।

+0

अनुरोध प्राप्त करने के लिए धन्यवाद। एपीआई ठीक काम कर रहा है लेकिन BasicNetwork.performRequest प्राप्त कर रहा है: अप्रत्याशित प्रतिक्रिया कोड 500. – JosephM

+0

@HemsLodha 500 - आंतरिक सर्वर त्रुटि "एक सामान्य त्रुटि संदेश, जब एक अप्रत्याशित स्थिति का सामना किया गया था और कोई और विशिष्ट संदेश उपयुक्त नहीं था" यह सर्वर पर समस्या है। – Malder

+0

समान त्रुटि उत्पन्न हुई, लेकिन मेरा "अप्रत्याशित प्रतिक्रिया कोड 415" था। मेरे पास सामग्री-प्रकार एप्लिकेशन/जेसन था, लेकिन charset = utf-8 जोड़ने के बाद, समस्या समाप्त हो गई है। –

23

एक तरह से VolleyError में प्रतिक्रिया डेटा के लिए जाँच करें और इसे अपने स्वयं पार्स करने के लिए है।

f605da3 commit, VolleyServerError 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

के लिए समाधान क्या है बहुत बहुत धन्यवाद !! यह एंड्रॉइड 4.4.2 में मेरी समस्या का समाधान करता है – sebasira

संबंधित मुद्दे