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);
尝试使用这个帮手类
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);
您可以创建一个自定义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,但是由于您正在创建请求,所以您可以在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));
如果你想要更多这最后一个字符串参数来自:
param = JsonUtils.XWWWUrlEncoder.encode(new JSONObject(paramasJObj)).toString();
和paramasJObj是这样的: {"id"="1","name"="myname"}
通常的JSON字符串。
您只需要在Request类中重写getParams方法即可。 我有同样的问题,我通过搜索的答案,但我找不到一个合适的。 问题不像get请求,被服务器重定向的post参数可能被丢弃。 例如,阅读这个 。 所以,不要冒着被网络服务器重定向的风险。 如果您的目标是http:// example / myapp ,请提及您的服务的确切地址,即http://example.com/myapp/index.php 。
排气是好的,完美的作品,问题源于其他地方。
重写函数getParams工作正常。 您使用POST方法,并已将jBody设置为null。 这就是为什么它不起作用。 如果你想发送null jBody,你可以使用GET方法。 我已经覆盖getParams方法,它使用GET方法(和空jBody)与POST方法(和jBody!= null)
这里还有所有的例子
- HTTP Post请求使用HttpClient需要2秒钟,为什么?
- 如何在Android L中为CardView小部件设置填充
- 当应用程序在后台时正确的解除DialogFragment的方法
- 在Android中检测物理菜单键按下
- 用于应用程序用户教程的showCase库的替代方法?
- 您所要求的物品不可购买
- 在XML中“缺lessimage上的contentDescription属性”
- 崩溃将AndroidKeyStoreRSAPrivateKey转换为RSAPrivateKey
- getApplicationContext(),getBaseContext(),getApplication(),getParent()