2013-09-27 66 views
7

Tôi làm việc với thư viện bóng chuyền Android! Tôi có một số không hiểu vấn đề với việc gửi yêu cầu với json và DELETE phương pháp từ máy chủ. Yêu cầu kết nối thành công với máy chủ nhưng máy chủ thông số được sended sẽ nhận được là trống. Nhưng tiêu đề yêu cầu làm việc normaly! Làm ơn giúp tôi!phương pháp xóa Volley android, tại sao sẽ gửi thông số trống

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(); 
     } 
    }; 
} 

Trả lời

3

issue này đã được giải quyết

bạn có thể viết lại lớp 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"); 

yêu cầu với phương pháp DELETE sẽ dễ dàng như POST, ví dụ:

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); 

mà chỉ có thể giải quyết android os 5.0 thiết bị vấn đề đã có vấn đề mới trên hệ điều hành Android 4.2.2 thiết bị nó sẽ ném ngoại lệ sau

java.net.ProtocolException: DELETE does not support writing 

để viết lại Volley.newRequestQueue (bối cảnh Bối cảnh, HttpStack stack) phương pháp có thể resovle vấn đề này

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); 
    } 
} 

nó làm việc cho tôi, hy vọng rằng công việc cho bạn cũng như

3

Cố gắng chuyển các tham số bằng URL như bạn thực hiện với yêu cầu GET. Làm việc cho tôi :)
mẫu Mã (không kiểm tra):

url += "?"; 
for(String key : params.keyset()){ 
    url += URLEncode.encode(key,"UTF-8") +"="+ URLEncode.encode(params.get(key),"UTF-8") +"&"; 
} 
url = url.substring(0, url.length()-1); // remove last '&' char 
Các vấn đề liên quan