android Volley删除方法,为什么会发送空参数

前端之家收集整理的这篇文章主要介绍了android Volley删除方法,为什么会发送空参数前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我使用 android volley库!我有一些不明白从服务器发送请求与json和DELETE方法的问题.请求成功连接到服务器但服务器将收到的已发送参数为空.但标题请求工作正常!请帮我!
  1. public void deletePoint(String id) throws JSONException {
  2. dialog.show();
  3. queue = Volley.newRequestQueue(getActivity(),new ExtHttpClientStack(new SslHttpClient().getHttpClient()));
  4. String urlRequest = getUrl();
  5. JSONObject param = new JSONObject();
  6. param.put("id",id);
  7. JsonObjectRequest userRequest = new JsonObjectRequest(Request.Method.DELETE,urlRequest,param,deletePointRequestSuccessListener(),reqErrorListener()){
  8. @Override
  9. public Map<String,String> getHeaders() throws AuthFailureError {
  10. Map<String,String> headers = super.getHeaders();
  11. if (headers == null || headers.equals(Collections.emptyMap())) {
  12. headers = new HashMap<String,String>();
  13. }
  14. if (ProgressFragment.this.headers != null) {
  15. headers.keySet().removeAll(ProgressFragment.this.headers.keySet());
  16. headers.putAll(ProgressFragment.this.headers);
  17. }
  18. headers.put("Content-Type","application/json");
  19. return headers;
  20. }
  21. };
  22.  
  23. userRequest.setRetryPolicy(new DefaultRetryPolicy(
  24. MY_SOCKET_TIMEOUT_MS,DefaultRetryPolicy.DEFAULT_MAX_RETRIES,DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
  25.  
  26. dialog.show();
  27. queue.add(userRequest);
  28. }
  29.  
  30. private Response.Listener<JSONObject> deletePointRequestSuccessListener() {
  31. return new Response.Listener<JSONObject>() {
  32. @Override
  33. public void onResponse(JSONObject response) {
  34. dialog.hide();
  35. Gson gson = new Gson();
  36. Success resp = gson.fromJson(response.toString(),Success.class);
  37. if(resp.isSuccess()){
  38. Toast.makeText(getActivity(),getString(R.string.success),Toast.LENGTH_SHORT).show();
  39. try {
  40. getGraphData();
  41. } catch (JSONException e) {
  42. e.printStackTrace();
  43. }
  44. }
  45. dialog.hide();
  46. }
  47. };
  48. }

解决方法

这是 issue已经解决

你可以重写HurlStack类

  1. public class HurlStack implements HttpStack {
  2. break;
  3. case Method.DELETE:
  4. connection.setRequestMethod("DELETE");
  5. addBodyIfExists(connection,request); // here call addBodyIfExists method
  6. break;
  7. case Method.POST:
  8. connection.setRequestMethod("POST");

例如,使用DELETE方法的请求将很容易作为POST

  1. mQueue = Volley.newRequestQueue(context);
  2. StringRequest postRequest = new StringRequest(Request.Method.DELETE,HttpUtils.URL_MSG,new Response.Listener<String>()
  3. {
  4. @Override
  5. public void onResponse(String response) {
  6. if (mCallBack!=null) {
  7. mCallBack.success(response);
  8. }
  9. }
  10. },new Response.ErrorListener()
  11. {
  12. @Override
  13. public void onErrorResponse(VolleyError error) {
  14. if (mCallBack!=null) {
  15. mCallBack.fail(null);
  16. }
  17. }
  18. }
  19. ) {
  20. @Override
  21. protected Map<String,String> getParams()
  22. {
  23. return params;
  24. }
  25.  
  26. };
  27.  
  28. mQueue.add(postRequest);

那只能解决android os 5.0设备的问题
android os 4.2.2设备上有新问题
它将引发以下异常

  1. java.net.ProtocolException: DELETE does not support writing

重写Volley.newRequestQueue(Context context,HttpStack stack)方法可以解决这个问题

  1. public static RequestQueue newRequestQueue(Context context,HttpStack stack) {
  2. .
  3. .
  4. .
  5.  
  6.  
  7. if (stack == null) {
  8. if (Build.VERSION.SDK_INT >= 9) {
  9. stack = new OkHttpStack();
  10. } else {
  11. // Prior to Gingerbread,HttpUrlConnection was unreliable.
  12. // See: http://android-developers.blogspot.com/2011/09/androids-http-clients.html
  13. stack = new HttpClientStack(AndroidHttpClient.newInstance(userAgent));
  14. }
  15. }
  16.  
  17. .
  18. .
  19. .
  20.  
  21.  
  22. return queue;
  23. }

OkHttpStack.java(okhttp-1.6.0.jar)

  1. public class OkHttpStack extends HurlStack {
  2. private final OkHttpClient client;
  3.  
  4. public OkHttpStack() {
  5. this(new OkHttpClient());
  6. }
  7.  
  8. public OkHttpStack(OkHttpClient client) {
  9. if (client == null) {
  10. throw new NullPointerException("Client must not be null.");
  11. }
  12. this.client = client;
  13. }
  14.  
  15. @Override protected HttpURLConnection createConnection(URL url) throws IOException {
  16. return client.open(url);
  17. }
  18. }

它对我有用,希望能为你效劳

猜你在找的Android相关文章