Volley JsonObjectRequest发布请求不起作用

我正在使用android volley提出请求。 所以我使用这个代码。 我不明白一件事。 我检查我的服务器params始终为空。 我认为getParams()不起作用。 我应该怎么做来解决这个问题。

RequestQueue queue = MyVolley.getRequestQueue(); JsonObjectRequest jsObjRequest = new JsonObjectRequest(Request.Method.POST,SPHERE_URL,null, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { System.out.println(response); hideProgressDialog(); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { hideProgressDialog(); } }) { protected Map<String, String> getParams() throws AuthFailureError { Map<String, String> params = new HashMap<String, String>(); params.put("id","1"); params.put("name", "myname"); return params; }; }; queue.add(jsObjRequest); 

Solutions Collecting From Web of "Volley JsonObjectRequest发布请求不起作用"

尝试使用这个帮手类

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

在activity / fragment中使用这个

 RequestQueue requestQueue = Volley.newRequestQueue(getActivity()); CustomRequest jsObjRequest = new CustomRequest(Method.POST, url, params, this.createRequestSuccessListener(), this.createRequestErrorListener()); requestQueue.add(jsObjRequest); 

您可以创build一个自定义JSONObjectReuqest并覆盖getParams方法,也可以在构造函数中将它们作为JSONObject给请求的主体。

像这样(我编辑你的代码):

 JSONObject obj = new JSONObject(); obj.put("id", "1"); obj.put("name", "myname"); RequestQueue queue = MyVolley.getRequestQueue(); JsonObjectRequest jsObjRequest = new JsonObjectRequest(Request.Method.POST,SPHERE_URL,obj, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { System.out.println(response); hideProgressDialog(); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { hideProgressDialog(); } }); queue.add(jsObjRequest); 

对我来说简单! 我几个星期前得到它:

这在getBody()方法中进行,而不在getParams()进行发布请求。

这是我的:

  @Override /** * Returns the raw POST or PUT body to be sent. * * @throws AuthFailureError in the event of auth failure */ public byte[] getBody() throws AuthFailureError { // Map<String, String> params = getParams(); Map<String, String> params = new HashMap<String, String>(); params.put("id","1"); params.put("name", "myname"); if (params != null && params.size() > 0) { return encodeParameters(params, getParamsEncoding()); } return null; } 

(我假设你想发布你在getParams中写的参数)

我在构造函数中给出了参数的params,但是由于您正在创build请求,所以您可以在getBody()方法的重写中对它们进行硬编码。

这是我的代码看起来像:

  Bundle param = new Bundle(); param.putString(HttpUtils.HTTP_CALL_TAG_KEY, tag); param.putString(HttpUtils.HTTP_CALL_PATH_KEY, url); param.putString(HttpUtils.HTTP_CALL_PARAM_KEY, params); switch (type) { case RequestType.POST: param.putInt(HttpUtils.HTTP_CALL_TYPE_KEY, RequestType.POST); SCMainActivity.mRequestQueue.add(new SCRequestPOST(Method.POST, url, this, tag, receiver, params)); 

如果你想要更多这最后一个string参数来自:

 param = JsonUtils.XWWWUrlEncoder.encode(new JSONObject(paramasJObj)).toString(); 

和paramasJObj是这样的: {"id"="1","name"="myname"}通常的JSONstring。

您只需要在Request类中重写getParams方法即可。 我有同样的问题,我通过search的答案,但我找不到一个合适的。 问题不像get请求,被服务器redirect的post参数可能被丢弃。 例如,阅读这个 。 所以,不要冒着被networking服务器redirect的风险。 如果您的目标是http:// example / myapp ,请提及您的服务的确切地址,即http://example.com/myapp/index.php
排气是好的,完美的作品,问题源于其他地方。

重写函数getParams工作正常。 您使用POST方法,并已将jBody设置为null。 这就是为什么它不起作用。 如果你想发送null jBody,你可以使用GET方法。 我已经覆盖getParams方法,它使用GET方法(和空jBody)与POST方法(和jBody!= null)

这里还有所有的例子

当您使用JsonObject请求时,您需要在初始化传递链接之后立即传递参数,请参阅以下代码:

  HashMap<String, String> params = new HashMap<>(); params.put("user", "something" ); params.put("some_params", "something" ); JsonObjectRequest request = new JsonObjectRequest(Request.Method.POST, "your_link", new JSONObject(params), new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { // Some code } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { //handel errors } }); }