我使用
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);
- }
- }
它对我有用,希望能为你效劳