web-dev-qa-db-ja.com

nullネットワーク応答を伴うVolley Serverエラー

VolleyでPOSTメソッドを使用しようとするたびに、サーバーエラーが発生します。getCauseでnull値、getNetworkResponse.toString()でデフォルト値を取得します。

GETメソッドを使用する場合、これは正常に機能します(URLから応答を取得します)。

誰でも私ができることを助けることができますか?

    Map<String, String> jsonParams = new HashMap<String, String>();
    jsonParams.put("teststr", "abd");

    RequestQueue requestQueue = VolleySingleton.getInstance().getRequestQueue();
    JsonObjectRequest request = new JsonObjectRequest(
            Request.Method.POST,
            url,
            new JSONObject(jsonParams),
            new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {

                    try {
                        Toast.makeText(getApplicationContext(), "Success"+response.toString(), Toast.LENGTH_LONG).show();
                    }catch(Exception e){
                        Toast.makeText(getApplicationContext(), "JSON ERROR", Toast.LENGTH_LONG).show();
                    }
                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    Log.d("abd", "Error: " + error
                                    + ">>" + error.networkResponse.statusCode
                                    + ">>" + error.networkResponse.data
                                    + ">>" + error.getCause()
                                    + ">>" + error.getMessage());
                }
            }) {

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

                @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;
                }
    };
    requestQueue.add(request);

エラーログ:

エラー:エラー:com.Android.volley.ServerError >> 404 >> [B @ 42b1e0d0 >> null >> null

PDATE:networkResponse.statusCodeは404になりますが、URLにアクセスできます(GETメソッドを使用する場合はデータを返します)。POSTメソッド、それでも同じです。

RL:

<?php
    $response = array();

    $jsonString = file_get_contents('php://input');
    $jsonObj = json_decode($jsonString, true);

    if(!isset($jsonObj['teststr'])){
        $response["msg"] = "No data.";
    }else{
        $response["msg"] = "Success: ".$jsonObj['teststr'];
    }
    echo json_encode($response);
?>
9
abdfahim

問題はあなたのキューです。ボレーコードを次のように変更します。

 RequestQueue queue = Volley.newRequestQueue(this);
 String URL = EndPoints.BASE_URL + "/call";
 StringRequest request = new StringRequest(Request.Method.POST, URL,
  new Response.Listener<String>()
  {
    @Override
    public void onResponse(String response) {

      Log.d("onResponse", response);

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

      NetworkResponse response = error.networkResponse;
      String errorMsg = "";
      if(response != null && response.data != null){
        String errorString = new String(response.data);
        Log.i("log error", errorString);
      }
    }
  }
) {
  @Override
  protected Map<String, String> getParams()
  {

    Map<String, String> params = new HashMap<String, String>();
    params.put("key_1","value_1");
    params.put("key_2", "value_2");
    Log.i("sending ", params.toString());

    return params;
  }

};


 // Add the realibility on the connection.
 request.setRetryPolicy(new DefaultRetryPolicy(10000, 1, 1.0f));

  // Start the request immediately
    queue.add(request);  

これにあなたのPHP(laravel)コード:

    $response['success'] = true;
    $response['user']['tell'] = $user->tell;
    $response['user']['code'] = $user->code;
    $response['user']['time'] = $time;
    $response['user']['register_state'] = '1'
    return response()->json($response, 200);
4
hadi.ghasemian

キューに追加する前にこのコードを追加してください

request.setRetryPolicy(new DefaultRetryPolicy(0、-1、DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

時々、PHPが完全に実行される前にリクエストがタイムアウトになることがあります。このコードを試してください。多分助けることができる

0
Bamz3r

応答を文字列として表示しようとすると、エラーが発生しました。

エラーを表示したり使用したりする場合は、response.toString()を使用します。

0
SONU SOURAV

Volleyは、組み込みのPOSTメソッドパラメーターを完全に処理しないため、カスタム応答を作成する必要があります。

回答はkatwal-Dipakがこれに似た他の投稿に投稿しています。 https://stackoverflow.com/a/31532955/4969957

これは完璧に機能しています。ありがとう。

0
Saksham Khurana

まあ、私はあなたのlogcatでresponseCodeを最初に印刷できると思います

0
shoxive

多分それはあなたのオペレータに関連しています...

VolleyでJasonObjectを送信するのと同じ問題があります。

2つの異なる演算子を使用して、9〜10台のデバイスでアプリをテストしました。

1つのオペレーターのリクエストは、すべてがnullまたは空白のデータを含むエラーを返します。もう1つのオペレーターのリクエストはすべて正常に動作し、APIからの応答を正常に取得します。

オペレーターがこの問題を引き起こす原因は何なのかわかりません。たぶん、彼らはJsonObjectの送信をブロックするある種のファイアウォールを使用しています。

0
S.Aslpour