web-dev-qa-db-ja.com

Android Volley-BasicNetwork.performRequest:予期しない応答コード400

問題ステートメント:

Volleyを使用して、さまざまなHTTPステータスコード(400、403、200など)のJSONオブジェクトを返すREST APIにアクセスしようとしています。

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

Volleyのソースコードを変更せずにこれを行う1つの方法は、VolleyError内の応答データを確認し、自分で解析することです。

f605da3 commitVolleyは、生のネットワーク応答を含む 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を実装することを望みます。

39
listboss
@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をヘッダーに追加する必要があります。

14
Tayseer

私も同じエラーを受け取りましたが、私の場合はrlを空白で呼び出していました。

次に、以下のように解析して修正しました。

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) {
                                ...
                                ...
                                ...
9
Rasool Mohamed

これを試して ...

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

ステータスコードを取得したいですか?

VolleyErrorのメンバー変数タイプはNetworkResponseであり、パブリックです。

Httpエラーコードのerror.networkResponse.statusCodeにアクセスできます。

皆さんのお役に立てば幸いです。

2
AngelInKate

私の場合、:8080でreg_urlを書いていませんでした。文字列reg_url = " http://192.168.29.163:8080/register.php ";

1
Manibala Sinha

変化する

public static final String URL = " http:// api-Location ";

public static final String URL = " https:// api-Location "

000webhostappアプリを使用しているために発生します

0
tnfaid

私がやったのは、URLに余分な「/」を追加することでしたe.g。

String url = "http://www.google.com" 

String url = "http://www.google.com/"
0
tick t

すべてを更新するために、いくつかの検討の後、以前の問題を解決するために代わりにAsync Http Clientを使用することにしました。このライブラリにより、特にすべてのシナリオ/ HTTPステータスでJSONオブジェクトが返される場合に、HTTP応答をよりクリーンなアプローチ(to me)で操作できます。

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();
            }
        }
    });
}
0
clearstake