android - অ্যান্ড্রয়েড ভোলি-বেসিক নেটওয়ার্ক.পারফর্মআরয়েস্ট: অপ্রত্যাশিত প্রতিক্রিয়া কোড 400




android-volley (6)

সমস্যা বিবৃতি:

আমি একটি REST এপিআই অ্যাক্সেস করার চেষ্টা করছি যা ভলির সাহায্যে বিভিন্ন HTTP স্থিতি কোডগুলির (400, 403, 200 ইত্যাদি) জন্য একটি JSON অবজেক্ট ফিরিয়ে দেবে।

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

আপনি মানে স্ট্যাটাস কোড পেতে চান?

VolleyError একটি NetworkResponse ভেরিয়েবল ধরণের NetworkResponse এবং এটি সর্বজনীন।

আপনি HTTP ত্রুটি কোডের জন্য ত্রুটি error.networkResponse.statusCode অ্যাক্সেস করতে পারেন।

আমি আশা করি এটি আপনার জন্য সহায়ক।



আমিও একই ত্রুটি পেয়েছি তবে আমার ক্ষেত্রে আমি ফাঁকা ফাঁকা জায়গায় ইউআরএল ডাকছিলাম।

তারপরে, আমি নীচের মত পার্স করে এটি ঠিক করেছি।

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) {
                                ...
                                ...
                                ...

এটা চেষ্টা কর ...

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

পরিবর্তন

পাবলিক স্ট্যাটিক ফাইনাল স্ট্রিং ইউআরএল = " http: // এপিআই-অবস্থান ";

প্রতি

সর্বজনীন স্ট্যাটিক চূড়ান্ত স্ট্রিং ইউআরএল = " https: // এপিআই-অবস্থান "

এটি ঘটেছে কারণ আমি 000webhostapp অ্যাপ্লিকেশন ব্যবহার করছি


VolleyError সোর্স কোডটি পরিবর্তন না করেই এটি করার একটি উপায় VolleyError প্রতিক্রিয়া সম্পর্কিত ডেটা পরীক্ষা করা এবং এটি নিজের VolleyError পার্স করা।

f605da3 commit , Volley একটি ServerError ব্যতিক্রম ছুঁড়েছে যা কাঁচা নেটওয়ার্ক প্রতিক্রিয়া ধারণ করে।

সুতরাং আপনি নিজের ত্রুটি শ্রোতার ক্ষেত্রে এর অনুরূপ কিছু করতে পারেন:

/* 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 বাস্তবায়ন করবে।







android-volley