以下是我的Volley POST方法Call。 POST参数没有将数据传递给Web服务器/ API几乎所有的尝试 1.覆盖byte [] getBody() 2.参数类型 3.使用JsonRequest
将四个POST参数解析到服务器并基于此进行响应。 这段代码中缺少什么?
private void generateTicket(final String field1, final String field2 , final String field3, final String field4) {
StringRequest strReq = new StringRequest(Method.POST,
AppConfig.URL_GENERATION, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
try {
JSONObject jObj = new JSONObject(response);
boolean error = jObj.getBoolean("error");
// Check for error node in json
if (!error) {
// SUCCESS CODE GOES HEAR
} else {
// Error in login. Get the error message
String errorMsg = jObj.getString("msg");
Toast.makeText(getApplicationContext(),
errorMsg, Toast.LENGTH_LONG).show();
}
} catch (JSONException e) {
// JSON error
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e(TAG, "API Error: " + error.getMessage());
Toast.makeText(getApplicationContext(),
error.getMessage(), Toast.LENGTH_LONG).show();
}
}) {
@Override
protected Map<String, String> getParams() throws com.android.volley.AuthFailureError {
// Posting parameters to the url
Map<String, String> params = new HashMap<String, String>();
params.put("tag", "generate");
params.put("field1", field1);
params.put("field2", field2);
params.put("field3", field3);
params.put("field4", field4);
return params;
}
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
Map<String,String> params = new HashMap<String, String>();
params.put("Content-Type","application/x-www-form-urlencoded");
// params.put("Content-Type", "application/json");
return params;
}
};
// Adding request to request queue
AppController.getInstance().addToRequestQueue(strReq, tag_string_req);
}
答案 0 :(得分:1)
在将请求添加到队列之前,请尝试request.setShouldCache(false);
。
我猜也许它会有所帮助。
默认情况下,volley会缓存响应。当它再次遇到网址时,它将从其缓存中获取而不是来自网络。即使重新安装应用程序(就像在调试中一样),缓存仍然在这里。但卸载和安装将清除缓存。
如果使用POST方法,请不要使用JsonRequest。它根本不会调用getParams()
。
答案 1 :(得分:1)
对于我来说,很奇怪的解决方案是
我的连接URL是
http://something.com/folder1/folder2
其中folder2包含一个index.php文件,用于处理请求。
更改为
http://something.com/folder1/folder2/ (在末尾添加/)解决了问题,服务器接收到POST数据
不知道为什么,但是我以前见过。几乎找不到答案,没有人谈论。希望这个答案可以对某人有所帮助。
答案 2 :(得分:0)
你收到任何错误吗?如果是这样,请更新您的帖子。代码看起来很好。 但是,如果仍有问题,可以使用以下代码
JsonObjectRequest jsonObjReq = new JsonObjectRequest(Method.POST,
url, null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
Log.d(TAG, response.toString());
pDialog.hide();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
VolleyLog.d(TAG, "Error: " + error.getMessage());
pDialog.hide();
}
}) {
/**
* Passing some request headers
* */
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
HashMap<String, String> headers = new HashMap<String, String>();
headers.put("Content-Type", "application/json");
headers.put("apiKey", "xxxxxxxxxxxxxxx");
return headers;
}
};
// Adding request to request queue
AppController.getInstance().addToRequestQueue(jsonObjReq, tag_json_obj);
答案 3 :(得分:0)
这个对我有用(见Volley JsonObjectRequest Post parameters no longer work)
String url = "https://www.youraddress.com/";
Map<String, String> params = new HashMap();
params.put("first_param", 1);
params.put("second_param", 2);
JSONObject parameters = new JSONObject(params);
JsonObjectRequest jsonRequest = new JsonObjectRequest(Request.Method.GET, url, parameters, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
//TODO: handle success
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
error.printStackTrace();
//TODO: handle failure
}
});
Volley.newRequestQueue(this).add(jsonRequest);