我目前正尝试通过Google Volley向我的服务器发送简单的POST请求。 因此,我写了以下几行代码:
Map<String, String> params = new HashMap<String, String>();
params.put("regId", "skdjasjdaljdlksajskl");
JSONObject object = new JSONObject(params);
JsonObjectRequest request = new JsonObjectRequest(Method.POST,
"address_of_my_server/method", object,
successListener, errorListener);
queue.add(request);
但是我得到了一个错误500,它说,有一个缺失的参数(regId)。我已尝试使用GET-Request进行相同操作,但结果相同。
只有当我使用带有格式化URL的StringRequest时,例如&#34; address_of_my_server / method?regId = sadlasjdlasdklsj&#34;服务器回复200。
当我使用StringRequest时,我得到完全相同的结果:
StringRequest request = new StringRequest(Method.POST,
"myurl", successListener,
errorListener){
@Override
protected Map<String, String> getParams()
throws AuthFailureError {
Map<String, String> params = new HashMap<String, String>();
params.put("regId", "skdjasjdaljdlksajskl");
return params;
}
};
为什么Volley忽略了我的参数?
答案 0 :(得分:3)
我上周遇到了同样的问题,但现在已经修好了。 您的服务器接受Content-Type作为表单数据,当发送volley的JsonObjectRequest时,请求的content-type将是application / json,因此整个params将作为一个json主体发送,而不是作为Stringrequest中的键值对。 更改服务器代码以从http请求正文获取请求参数,而不是从密钥获取它(如php中的$ _REQUEST ['name'])。
答案 1 :(得分:3)
使用此助手类:
import java.io.UnsupportedEncodingException; import java.util.Map; import org.json.JSONException; import org.json.JSONObject; import com.android.volley.NetworkResponse; import com.android.volley.ParseError; import com.android.volley.Request; import com.android.volley.Response; import com.android.volley.Response.ErrorListener; import com.android.volley.Response.Listener; import com.android.volley.toolbox.HttpHeaderParser; public class CustomRequest extends Request<JSONObject> { private Listener<JSONObject> listener; private Map<String, String> params; public CustomRequest(String url, Map<String, String> params, Listener<JSONObject> reponseListener, ErrorListener errorListener) { super(Method.GET, url, errorListener); this.listener = reponseListener; this.params = params; } public CustomRequest(int method, String url, Map<String, String> params, Listener<JSONObject> reponseListener, ErrorListener errorListener) { super(method, url, errorListener); this.listener = reponseListener; this.params = params; } protected Map<String, String> getParams() throws com.android.volley.AuthFailureError { return params; }; @Override protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) { try { String jsonString = new String(response.data, HttpHeaderParser.parseCharset(response.headers)); return Response.success(new JSONObject(jsonString), HttpHeaderParser.parseCacheHeaders(response)); } catch (UnsupportedEncodingException e) { return Response.error(new ParseError(e)); } catch (JSONException je) { return Response.error(new ParseError(je)); } } @Override protected void deliverResponse(JSONObject response) { // TODO Auto-generated method stub listener.onResponse(response); } }
答案 2 :(得分:2)
以Rajesh Batth提到
的问题为例Java代码:
JSONObject obj = new JSONObject();
try {
obj.put("id", "1");
obj.put("name", "myname");
} catch (JSONException e) {
e.printStackTrace();
}
JsonObjectRequest jsObjRequest = new JsonObjectRequest(
Request.Method.POST, url, obj, listener, errorlistener);
RequestQueue queue = Volley.newRequestQueue(context);
queue.add(jsObjRequest);
PHP-代码:
$body = file_get_contents('php://input');
$postvars = json_decode($body, true);
$id = $postvars["id"];
$name = $postvars["name"];
注意:
如果您没有发送额外的GET-VARS,则PHP-Vars $_POST
和$_REQUEST
以及$_GET
为空。
答案 3 :(得分:1)
编辑:
我删除了之前的答案,因为它不准确。
我会回顾我今天所知道的:
显然,getParams
应该有效。但它并不总是如此。
我自己调试了它,似乎在执行PUT或POST请求时调用它,并且该方法中提供的参数在常规GET参数字符串(?param1=value1¶m2=value2
...)中并编码和放置在体内。
我不知道为什么但是由于某些原因这对某些服务器不起作用。
我知道发送参数的最佳替代方法是将参数放在JSONObject
中,并使用请求构造函数将其内容编码在请求的正文中。
答案 4 :(得分:0)
这是我的解决方案
解决方案 1
public void getData() {
final RequestQueue queue = Volley.newRequestQueue(this);
StringRequest postRequest = new StringRequest(Request.Method.POST, "192.168.0.0/XYZ",new Response.Listener<String>() {
@Override
public void onResponse(String response) {
try {
JSONArray myArray = new JSONArray(response);
for(int i = 0; i < myArray.length(); i++)
{
JSONObject jObj = myArray.getJSONObject(i);
String category = jObj.getString("nameUser");
Log.e("value", category);
}
} catch (JSONException e) {
e.printStackTrace();
Log.e("error: ", e.getMessage());
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
//Toast.makeText(context,"Error : ").show();
}
}){
@Override
protected Map<String, String> getParams() {
Map<String, String> params = new HashMap<String, String>();
params.put("id_user", "1");
return params;
}
};
queue.add(postRequest);
}
解决方案 2
记住,如果你使用php,$ _POST [''];
不工作,her更多信息。
祝你好运