2016-11-11 19 views
0

私は、volleyライブラリを使用してURLにPOSTリクエストをしなければなりません。私はボレーのために次のカスタムクラスを構築しました: - CustomJSONObjectRequestAndroidのボレーの投稿のリクエストが正しく機能していない

import com.android.volley.AuthFailureError; 
import com.android.volley.Response; 
import com.android.volley.RetryPolicy; 
import com.android.volley.toolbox.JsonObjectRequest; 

import org.json.JSONObject; 

import java.util.HashMap; 
import java.util.Map; 

/** 
* Created by user on 4/14/2016. 
*/ 

public class CustomJSONObjectRequest extends JsonObjectRequest { 
    Map<String, String> mParams; 

    public CustomJSONObjectRequest(int method, String url, JSONObject jsonRequest, 
            Response.Listener<JSONObject> listener, 
            Response.ErrorListener errorListener) { 
     super(method, url, jsonRequest, listener, errorListener); 
    } 

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

    @Override 
    protected Map<String, String> getParams() throws AuthFailureError { 

     return mParams; 
    } 

    @Override 
    public RetryPolicy getRetryPolicy() { 
     // here you can write a custom retry policy 

     return super.getRetryPolicy(); 
    } 


} 

CustomVolleyRequestQueue

import android.content.Context; 

import com.android.volley.Cache; 
import com.android.volley.Network; 
import com.android.volley.RequestQueue; 
import com.android.volley.toolbox.BasicNetwork; 
import com.android.volley.toolbox.DiskBasedCache; 
import com.android.volley.toolbox.HurlStack; 

/** 
* Created by Devastrix on 4/14/2016. 
*/ 
public class CustomVolleyRequestQueue { 

    private static CustomVolleyRequestQueue mInstance; 
    private static Context mCtx; 
    private RequestQueue mRequestQueue; 

    private CustomVolleyRequestQueue(Context context) { 
     mCtx = context; 
     mRequestQueue = getRequestQueue(); 
    } 

    public static synchronized CustomVolleyRequestQueue getInstance(Context context) { 
     if (mInstance == null) { 
      mInstance = new CustomVolleyRequestQueue(context); 
     } 
     return mInstance; 
    } 

    public RequestQueue getRequestQueue() { 
     if (mRequestQueue == null) { 
      Cache cache = new DiskBasedCache(mCtx.getCacheDir(), 10 * 1024 * 1024); 
      Network network = new BasicNetwork(new HurlStack()); 
      mRequestQueue = new RequestQueue(cache, network); 
      // Don't forget to start the volley request queue 
      mRequestQueue.start(); 
     } 
     return mRequestQueue; 
    } 

} 

を私はPOSTリクエストを作成するには、次の関数を使用しています: -

RequestQueue mQueue = CustomVolleyRequestQueue.getInstance(context) 
       .getRequestQueue(); 
     String url = "someURL"; 
     Log.d("URL= ", url); 
     final CustomJSONObjectRequest jsonRequest = new CustomJSONObjectRequest(Request.Method.POST, url, 
       new JSONObject(), new Response.Listener<JSONObject>() { 

      @Override 
      public void onResponse(JSONObject response) { 

       Log.d("post: ", response+""); 

      } 

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


      } 
     }) { 
      @Override 
      protected Map<String, String> getParams() { 

       Map<String,String> params = new HashMap<String, String>(); 
       params.put("A", "[[\"123\",\"456\",\"789\"]]"); // it is a json string actually 
       params.put("B", "23-11-2016"); 
       params.put("C", "ABC"); 
       return params; 
       //return query; 
      } 
     }; 
     jsonRequest.setTag(TAG); 
     int socketTimeout = TIMEOUT;//30 seconds - 
     RetryPolicy policy = new DefaultRetryPolicy(socketTimeout, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT); 
     jsonRequest.setRetryPolicy(policy); 
     mQueue.add(jsonRequest); 

しかし、問題はリクエストが返されていることです私はPOST要求のためにいくつかのサードパーティーのアプリケーションを使用している間、それは正しい結果を返します。バグの可能性はありますか?

EDIT - 実際にはレスポンスはnullではありません。本当の反応はこうです。

{ 
    "data" : "" 
} 

しかし、データ・キーは、私はのparamsかのparamsが正しく送信され取得されていないとのいずれかの問題があると思い、空value.SOを持つべきではありません。しかし、paramsは私がチェックしたtotaly正しいです。

+0

POST(2xx)が成功した場合、どのようなデータが返されると思いますか?また、そのデータはどのようなフォーマットであるべきですか? JSON? – clownba0t

+0

データはJSON形式です。キー 'データ'にはいくつかのJSONObjectが含まれている必要がありますが、レスポンスには空のキーを持つ 'データ'キーが表示されます。 – devastrix

+0

私は参照してください。私が考えることができるのは、サーバーが本当に 'data'属性のために何も返さないということだけです。サーバー側でログを追加して、応答を構築するときにサーバーが 'data'にパックしているものを正確に見ることができるようにしてください。または、アプリケーション側では、生の応答が内部のデータが 'JSONObject'に変換される前に代行応答し、その内容を確認します。 'Protected Response parseNetworkResponse(NetworkResponse response){'をオーバーライドし、デバッガまたはロギングを使用してこれを行うことができます。 – clownba0t

答えて

0

この依存関係をプロジェクトのbuild.gradleメソッドに追加してください。この後に を送信し、サーバーに送信するパラメータを追加します。

compile 'com.android.volley:volley:1.0.0' 

あなたのプロジェクトにこのアクティビティを追加してください。

public class MainActivity extends AppCompatActivity { 
    private ProgressDialog progress_dialog; 
    private RequestQueue queue; 
    private HashMap<String, String> map = new HashMap<>(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     queue= Volley.newRequestQueue(getApplicationContext()); 
     GetEventCodeResponse("[email protected]","4"); 

    } 
    public void GetEventCodeResponse(String email,String event){ 
     progress_dialog = new ProgressDialog(this); 
     progress_dialog.setMessage("Getting data, please wait a moment..."); 
     progress_dialog.show(); 
     map.put("username", email); 
     map.put("eventcode", event); 
     getResponseFromServer("your own url",map); 
    } 
    public void getResponseFromServer(String url, final HashMap<String, String> map) { 
     System.out.println("url----"+url); 
     StringRequest stringRequest = new StringRequest(Request.Method.POST, url, 
       new Response.Listener<String>() { 
        @Override 
        public void onResponse(String response) { 
         Log.e("response reviw--",response); 
         progress_dialog.dismiss(); 
         /* rating();*/ 
        } 
       }, 
       new Response.ErrorListener() { 
        @Override 
        public void onErrorResponse(VolleyError error) { 
         try{ 
          Log.e("sign error password", new String(error.networkResponse.data)); 

         }catch (Exception e){ 
          Toast.makeText(MainActivity.this, "try again", Toast.LENGTH_SHORT).show(); 
         } 

         progress_dialog.dismiss(); 
        } 
       }) 
     { 
      @Override 
      protected Map<String, String> getParams() { 
       return map; 
      } 
     }; 
     queue.add(stringRequest); 
     stringRequest.setRetryPolicy(new DefaultRetryPolicy(
       100000, 
       DefaultRetryPolicy.DEFAULT_MAX_RETRIES, 
       DefaultRetryPolicy.DEFAULT_BACKOFF_MULT)); 
    } 
} 
+0

が機能していません...このコードは実際に鉱山と似ています – devastrix

0

だけで確認すると、要求は間違いなく成功しているとあなたが要求に提供しているResponse.Listener<JSONObject>インスタンスのonResponse(JSONObject response)方法は、応答がnullていると呼ばれていますか?

また、そこにvolley関連のlogcatが表示されますか?コメントへの応答で

アップデートは

私の気持ちは、我々はまだあなたが見ている問題について明確な根本的な原因をロックダウンしていないということですので、私は次のコードが解決されることを保証することはできませんそれ。あなたが質問したとおり、以下を試してみてください:

RequestQueue mQueue = CustomVolleyRequestQueue.getInstance(context).getRequestQueue(); 
String url = "someURL"; 
Log.d("URL= ", url); 

final JSONObject requestBody; 
try { 
    requestBody = new JSONObject(); 
    requestBody.put("A", new JSONArray(new String[]{ "123", "456", "789" }); 
    requestBody.put("B", "23-11-2016"); 
    requestBody.put("C", "ABC"); 
} catch (JSONException exception) { 
    // error handling which, at least in theory, shouldn't be needed ... 
} 

final CustomJSONObjectRequest jsonRequest = new CustomJSONObjectRequest(Request.Method.POST, url, 
      requestBody, new Response.Listener<JSONObject>() { 

     @Override 
     public void onResponse(JSONObject response) { 

      Log.d("post: ", response+""); 

     } 

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


     } 
    }); 

jsonRequest.setTag(TAG); 
int socketTimeout = TIMEOUT;//30 seconds - 
RetryPolicy policy = new DefaultRetryPolicy(socketTimeout, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, 
     DefaultRetryPolicy.DEFAULT_BACKOFF_MULT); 
jsonRequest.setRetryPolicy(policy); 
mQueue.add(jsonRequest); 
+0

はい応答は生成されますが、それはnullです。いいえ、私はVolley logcatを使用していません – devastrix

+0

それは奇妙です...'JsonObjectRequest'は成功したときに新しい' JSONObject'を作成し、応答本体のデータを解析できない場合は例外をスローします。 'onResponse'メソッドで' response'オブジェクトが 'nullにならない'?申し訳ありませんが、私は助けることができませんでした...私はそれについて考え続けます! – clownba0t

+0

実際にはレスポンスはnullではありません。真の応答は、値が空の文字列として返されるキー値のペアです。だから、paramsに問題があるとか、paramsが正しく送信されていないと思います。しかし、paramsは私がチェックしたtotaly正しいです。 – devastrix

関連する問題