2014-04-02 8 views
9

मैं अपने सर्वर पर एक डिलीट प्रकार अनुरोध भेजने और अनुरोध में पैरामीटर जोड़ने के लिए वॉली का उपयोग करने की कोशिश कर रहा हूं। अब तक मैं ऐसा करने में सक्षम नहीं हूं।वॉली - DELETE अनुरोध पैरामीटर कैसे भेजें?

कस्टम अनुरोध बनाना और getParams() विधि को ओवरराइड करने से मेरी सहायता नहीं हुई क्योंकि इस विधि को DELETE प्रकार अनुरोध के लिए नहीं कहा जाता है।

मैं वॉली में एक डेली अनुरोध में पैरामीटर कैसे जोड़ सकता हूं?

उत्तर

12

एक ही समस्या यहाँ लेकिन मैं समाधान मिल गया।

समस्या com.android.volley.toolbox.HttpClientStack.java में createHttpRequest विधि का कार्यान्वयन है जो अनुरोध विधि है POUT, PUT या पैच।

/** 
* Creates the appropriate subclass of HttpUriRequest for passed in request. 
*/ 
@SuppressWarnings("deprecation") 
/* protected */ static HttpUriRequest createHttpRequest(Request<?> request, 
     Map<String, String> additionalHeaders) throws AuthFailureError { 
    switch (request.getMethod()) { 
     case Method.DEPRECATED_GET_OR_POST: { 
      // This is the deprecated way that needs to be handled for backwards compatibility. 
      // If the request's post body is null, then the assumption is that the request is 
      // GET. Otherwise, it is assumed that the request is a POST. 
      byte[] postBody = request.getPostBody(); 
      if (postBody != null) { 
       HttpPost postRequest = new HttpPost(request.getUrl()); 
       postRequest.addHeader(HEADER_CONTENT_TYPE, request.getPostBodyContentType()); 
       HttpEntity entity; 
       entity = new ByteArrayEntity(postBody); 
       postRequest.setEntity(entity); 
       return postRequest; 
      } else { 
       return new HttpGet(request.getUrl()); 
      } 
     } 
     case Method.GET: 
      return new HttpGet(request.getUrl()); 
     case Method.DELETE: 
      return new HttpDelete(request.getUrl()); 
     case Method.POST: { 
      HttpPost postRequest = new HttpPost(request.getUrl()); 
      postRequest.addHeader(HEADER_CONTENT_TYPE, request.getBodyContentType()); 
      setEntityIfNonEmptyBody(postRequest, request); 
      return postRequest; 
     } 
     case Method.PUT: { 
      HttpPut putRequest = new HttpPut(request.getUrl()); 
      putRequest.addHeader(HEADER_CONTENT_TYPE, request.getBodyContentType()); 
      setEntityIfNonEmptyBody(putRequest, request); 
      return putRequest; 
     } 
     case Method.HEAD: 
      return new HttpHead(request.getUrl()); 
     case Method.OPTIONS: 
      return new HttpOptions(request.getUrl()); 
     case Method.TRACE: 
      return new HttpTrace(request.getUrl()); 
     case Method.PATCH: { 
      HttpPatch patchRequest = new HttpPatch(request.getUrl()); 
      patchRequest.addHeader(HEADER_CONTENT_TYPE, request.getBodyContentType()); 
      setEntityIfNonEmptyBody(patchRequest, request); 
      return patchRequest; 
     } 
     default: 
      throw new IllegalStateException("Unknown request method."); 
    } 
} 

तो तुम HttpStack.java का अपना स्वयं का कार्यान्वयन उपयोग करने के लिए है या आप HttpClientStack वर्ग को ओवरराइड।

सबसे पहले अपने सभी RequestQueue के अपने प्रारंभ जहां का केस बदल

String userAgent = "volley/0"; 
    try { 
     String packageName = getContext().getPackageName(); 
     PackageInfo info = getContext().getPackageManager().getPackageInfo(packageName, 0); 
     userAgent = packageName + "/" + info.versionCode; 
    } catch (PackageManager.NameNotFoundException e) {} 
    HttpStack httpStack = new OwnHttpClientStack(AndroidHttpClient.newInstance(userAgent)); 
    RequestQueue requesQueue = Volley.newRequestQueue(sContext, httpStack); 

को

RequestQueue requestQueue = Volley.newRequestQueue(sContext); 

से बदल सकते हैं और HttpClientStack का अपना स्वयं का कार्यान्वयन लिखना चाहिए: में "Method.POST" विधि बनाएँ HttpRequest()। विधि सेटEntityIfNonEmptyBody() विधि का उपयोग करने के लिए आपको HttpEntityEnclosingRequestBase के विस्तार के रूप में "OwnHDDelete" जैसे ऑब्जेक्ट को भी बनाना होगा।

public class OwnHttpClientStack extends com.android.volley.toolbox.HttpClientStack { 
    private final static String HEADER_CONTENT_TYPE = "Content-Type"; 

    public OwnHttpClientStack(HttpClient client) { 
     super(client); 
    } 

    @Override 
    public HttpResponse performRequest(Request<?> request, Map<String, String> additionalHeaders) 
      throws IOException, AuthFailureError { 
     HttpUriRequest httpRequest = createHttpRequest(request, additionalHeaders); 
     addHeaders(httpRequest, additionalHeaders); 
     addHeaders(httpRequest, request.getHeaders()); 
     onPrepareRequest(httpRequest); 
     HttpParams httpParams = httpRequest.getParams(); 
     int timeoutMs = request.getTimeoutMs(); 
     // TODO: Reevaluate this connection timeout based on more wide-scale 
     // data collection and possibly different for wifi vs. 3G. 
     HttpConnectionParams.setConnectionTimeout(httpParams, 5000); 
     HttpConnectionParams.setSoTimeout(httpParams, timeoutMs); 
     return mClient.execute(httpRequest); 
    } 

    private static void addHeaders(HttpUriRequest httpRequest, Map<String, String> headers) { 
     for (String key : headers.keySet()) { 
      httpRequest.setHeader(key, headers.get(key)); 
     } 
    } 

    static HttpUriRequest createHttpRequest(Request<?> request, Map<String, String> additionalHeaders) throws AuthFailureError { 
     switch (request.getMethod()) { 
      case Request.Method.DEPRECATED_GET_OR_POST: { 
       byte[] postBody = request.getPostBody(); 
       if (postBody != null) { 
        HttpPost postRequest = new HttpPost(request.getUrl()); 
        postRequest.addHeader(HEADER_CONTENT_TYPE, request.getPostBodyContentType()); 
        HttpEntity entity; 
        entity = new ByteArrayEntity(postBody); 
        postRequest.setEntity(entity); 
        return postRequest; 
       } else { 
        return new HttpGet(request.getUrl()); 
       } 
      } 
      case Request.Method.GET: 
       return new HttpGet(request.getUrl()); 
      case Request.Method.DELETE: 
       OwnHttpDelete deleteRequest = new OwnHttpDelete(request.getUrl()); 
       deleteRequest.addHeader(HEADER_CONTENT_TYPE, request.getBodyContentType()); 
       setEntityIfNonEmptyBody(deleteRequest, request); 
       return deleteRequest; 
      case Request.Method.POST: { 
       HttpPost postRequest = new HttpPost(request.getUrl()); 
       postRequest.addHeader(HEADER_CONTENT_TYPE, request.getBodyContentType()); 
       setEntityIfNonEmptyBody(postRequest, request); 
       return postRequest; 
      } 
      case Request.Method.PUT: { 
       HttpPut putRequest = new HttpPut(request.getUrl()); 
       putRequest.addHeader(HEADER_CONTENT_TYPE, request.getBodyContentType()); 
       setEntityIfNonEmptyBody(putRequest, request); 
       return putRequest; 
      } 
      case Request.Method.HEAD: 
       return new HttpHead(request.getUrl()); 
      case Request.Method.OPTIONS: 
       return new HttpOptions(request.getUrl()); 
      case Request.Method.TRACE: 
       return new HttpTrace(request.getUrl()); 
      case Request.Method.PATCH: { 
       HttpPatch patchRequest = new HttpPatch(request.getUrl()); 
       patchRequest.addHeader(HEADER_CONTENT_TYPE, request.getBodyContentType()); 
       setEntityIfNonEmptyBody(patchRequest, request); 
       return patchRequest; 
      } 
      default: 
       throw new IllegalStateException("Unknown request method."); 
     } 
    } 

    private static void setEntityIfNonEmptyBody(HttpEntityEnclosingRequestBase httpRequest, 
               Request<?> request) throws AuthFailureError { 
     byte[] body = request.getBody(); 
     if (body != null) { 
      HttpEntity entity = new ByteArrayEntity(body); 
      httpRequest.setEntity(entity); 
     } 
    } 

    private static class OwnHttpDelete extends HttpPost { 
     public static final String METHOD_NAME = "DELETE"; 

     public OwnHttpDelete() { 
      super(); 
     } 

     public OwnHttpDelete(URI uri) { 
      super(uri); 
     } 

     public OwnHttpDelete(String uri) { 
      super(uri); 
     } 

     public String getMethod() { 
      return METHOD_NAME; 
     } 
    } 
} 

मुझे आशा है कि मेरे कोड किसी को मदद मिलेगी। एक HEAD अनुरोध में पैरामीटर जोड़ना भी संभव होना चाहिए।

+0

आपने मेरा दिन बचाया !!! – codeskraps

+0

पहले मैंने कोशिश की, और सब ठीक हो गया, लेकिन फिर छवि लोडिंग के साथ एक समस्या थी। मेरे पास 2 NetworkImageViews थे जिन्हें एक ही छवि लोड करना पड़ा था। एक लोड, दूसरा नहीं था। पता चला कि आपका समाधान एंड्रॉइड संस्करण 9 और उससे कम के लिए है। – kroky

2

वॉली के कोड के माध्यम से कुछ और पढ़ने और खोदने के बाद, मैं इस निष्कर्ष पर पहुंचा कि वॉली में एक डेली अनुरोध के लिए अनुलग्नक पैरामीटर का कोई तरीका नहीं है - संभवतः एक डिजाइन पसंद के रूप में ऐसा लगता है आम तौर पर फेंकने के लिए।

मैं यह जानना चाहता था कि इसे कैसे किया जाए क्योंकि मैं अपने सर्वर पर भेजे जा रहे हर प्रकार के अनुरोध के लिए एक एपीआई कुंजी संलग्न करना चाहता था।

यदि कोई खुद को एक ही समस्या के साथ पाता है, तो मैं क्या कर रहा हूं (और मुझे पूरा यकीन है कि यह यहां जाने का तरीका है) अनुरोध के शीर्षकों में एपीआई कुंजी भेजता है। विशेष रूप से वॉली में इसका अर्थ है GetHeaders() विधि को ओवरराइड करना और आपको आवश्यक पैरामीटर जोड़ें।

यहाँ कोड के अपने बिट है:

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

    headers.put("API_KEY", apiKey); 

    return headers; 
} 
संबंधित मुद्दे