私は、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正しいです。
POST(2xx)が成功した場合、どのようなデータが返されると思いますか?また、そのデータはどのようなフォーマットであるべきですか? JSON? – clownba0t
データはJSON形式です。キー 'データ'にはいくつかのJSONObjectが含まれている必要がありますが、レスポンスには空のキーを持つ 'データ'キーが表示されます。 – devastrix
私は参照してください。私が考えることができるのは、サーバーが本当に 'data'属性のために何も返さないということだけです。サーバー側でログを追加して、応答を構築するときにサーバーが 'data'にパックしているものを正確に見ることができるようにしてください。または、アプリケーション側では、生の応答が内部のデータが 'JSONObject'に変換される前に代行応答し、その内容を確認します。 'Protected Response parseNetworkResponse(NetworkResponse response){'をオーバーライドし、デバッガまたはロギングを使用してこれを行うことができます。 –
clownba0t