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