2013-09-27 11 views
7

Io lavoro con la libreria Android di volley! Ho alcuni non capisco il problema con l'invio di richiesta con il metodo json e DELETE dal server. Richiesta di connessione con successo al server ma i parametri inviati che il server riceverà sarà vuoto. Ma la richiesta di intestazione funziona normalmente! Mi aiuti per favore!metodo di eliminazione Volley Android, perché invierà i parametri vuoti

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

risposta

3

è questo issue che è stato risolto

si può riscrivere la classe 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"); 

richiesta con metodo DELETE volontà essere facile come POST, per esempio

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

che può risolvere solo sistema operativo Android 5.0 dispositivi problematici v'è nuovo problema sul sistema operativo Android 4.2.2 dispositivo getterà la seguente eccezione

java.net.ProtocolException: DELETE does not support writing 

di riscrivere Volley.newRequestQueue (contesto Context, HttpStack stack) metodo può resovle questo problema

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

funziona per me, sperando che funzioni anche per te

3

Provare a passare i parametri con l'URL come si farebbe con una richiesta GET. Ha funzionato per me :)
Esempio di codice (non testato):

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 
Problemi correlati