【发布时间】:2016-11-11 09:48:21
【问题描述】:
我必须使用 volley 库向 url 发出 POST 请求。我为 volley 构建了以下自定义类:- CustomJSONObjectRequest
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 - 实际上响应不为空。真实的反应是这样的。
{
"data" : ""
}
但是数据键不应该有空值。所以我认为参数有问题或者参数没有正确发送。但是我检查过的参数是完全正确的。
【问题讨论】:
-
您希望服务器返回什么数据以响应成功的 (2xx) POST?另外,该数据应该采用什么格式? JSON?
-
数据为 JSON 格式。键“数据”应包含一些 JSONObject,但响应显示“数据”键具有空键。
-
我明白了。我唯一能想到的是服务器确实没有为
data属性返回任何内容。尝试在服务器端添加日志记录,这样您就可以在构建响应时准确地看到服务器正在打包到data中的内容。或者,在应用程序端,在其中的数据转换为JSONObject之前拦截原始响应,并检查其内容。您应该能够通过覆盖protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {并使用调试器或日志记录来做到这一点。 -
我也面临同样的问题,凌空返回我空字符串“”,不知道为什么。 :(
标签: android json post android-volley