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

前端之家收集整理的这篇文章主要介绍了android Volley删除方法,为什么会发送空参数前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我使用 android volley库!我有一些不明白从服务器发送请求与json和DELETE方法的问题.请求成功连接到服务器但服务器将收到的已发送参数为空.但标题请求工作正常!请帮我!
public void deletePoint(String id) throws JSONException {
    dialog.show();
    queue = Volley.newRequestQueue(getActivity(),new ExtHttpClientStack(new SslHttpClient().getHttpClient()));
    String urlRequest = getUrl();
    JSONObject param = new JSONObject();
    param.put("id",id);
    JsonObjectRequest userRequest = new JsonObjectRequest(Request.Method.DELETE,urlRequest,param,deletePointRequestSuccessListener(),reqErrorListener()){
        @Override
        public Map<String,String> getHeaders() throws AuthFailureError {
            Map<String,String> headers = super.getHeaders();
            if (headers == null || headers.equals(Collections.emptyMap())) {
                headers = new HashMap<String,String>();
            }
            if (ProgressFragment.this.headers != null) {
                headers.keySet().removeAll(ProgressFragment.this.headers.keySet());
                headers.putAll(ProgressFragment.this.headers);
            }
            headers.put("Content-Type","application/json");
            return headers;
        }
    };

    userRequest.setRetryPolicy(new DefaultRetryPolicy(
            MY_SOCKET_TIMEOUT_MS,DefaultRetryPolicy.DEFAULT_MAX_RETRIES,DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

    dialog.show();
    queue.add(userRequest);
}

private Response.Listener<JSONObject> deletePointRequestSuccessListener() {
    return new Response.Listener<JSONObject>() {
        @Override
        public void onResponse(JSONObject response) {
            dialog.hide();
            Gson gson = new Gson();
            Success resp = gson.fromJson(response.toString(),Success.class);
            if(resp.isSuccess()){
                Toast.makeText(getActivity(),getString(R.string.success),Toast.LENGTH_SHORT).show();
                try {
                    getGraphData();
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
            dialog.hide();
        }
    };
}

解决方法

这是 issue已经解决

你可以重写HurlStack类

public class HurlStack implements HttpStack {
             break;
         case Method.DELETE:
             connection.setRequestMethod("DELETE");
             addBodyIfExists(connection,request); // here call addBodyIfExists method
             break;
         case Method.POST:
             connection.setRequestMethod("POST");

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

mQueue = Volley.newRequestQueue(context);
StringRequest postRequest = new StringRequest(Request.Method.DELETE,HttpUtils.URL_MSG,new Response.Listener<String>()
    {
        @Override
        public void onResponse(String response) {
            if (mCallBack!=null) {
            mCallBack.success(response);
            }
        }
    },new Response.ErrorListener()
    {
        @Override
        public void onErrorResponse(VolleyError error) {
        if (mCallBack!=null) {
            mCallBack.fail(null);
        }
        }
    }
) {
    @Override
    protected Map<String,String> getParams()
    {
    return params;
    }

};

mQueue.add(postRequest);

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

java.net.ProtocolException: DELETE does not support writing

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

public static RequestQueue newRequestQueue(Context context,HttpStack stack) {
    .
    .
    .


    if (stack == null) {
        if (Build.VERSION.SDK_INT >= 9) {
            stack = new OkHttpStack();
        } else {
            // Prior to Gingerbread,HttpUrlConnection was unreliable.
            // See: http://android-developers.blogspot.com/2011/09/androids-http-clients.html
            stack = new HttpClientStack(AndroidHttpClient.newInstance(userAgent));
        }
    }

    .
    .
    .


    return queue;
}

OkHttpStack.java(okhttp-1.6.0.jar)

public class OkHttpStack extends HurlStack {
  private final OkHttpClient client;

  public OkHttpStack() {
    this(new OkHttpClient());
  }

  public OkHttpStack(OkHttpClient client) {
    if (client == null) {
      throw new NullPointerException("Client must not be null.");
    }
    this.client = client;
  }

  @Override protected HttpURLConnection createConnection(URL url) throws IOException {
    return client.open(url);
  }   
}

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

猜你在找的Android相关文章