2015-11-06 10 views
18

मैं एक एंड्रॉइड ऐप विकसित कर रहा हूं जो मैंने लिखा एक विश्वसनीय वेब सेवा के साथ संवाद करता हूं। विधियों के लिए Volley का उपयोग करना अद्भुत और आसान है, लेकिन मैं अपनी उंगली POST विधियों पर नहीं डाल सकता।स्ट्रिंग बॉडी के साथ वॉली का उपयोग करके POST अनुरोध कैसे भेजें?

मैं अनुरोध के मुख्य भाग में एक String के साथ एक POST अनुरोध भेजने के लिए, और वेब सेवा के कच्चे प्रतिक्रिया (जैसे 200 ok, 500 server error) प्राप्त करना चाहते हैं।

मुझे लगता है कि StringRequest है जो डेटा (बॉडी) के साथ भेजने की अनुमति नहीं देता है, और यह मुझे पार्स किए गए String प्रतिक्रिया प्राप्त करने के लिए बाध्य करता है। मैं JsonObjectRequest पर भी आया जो डेटा (बॉडी) स्वीकार करता है लेकिन एक पार्सेड JSONObject प्रतिक्रिया पुनर्प्राप्त करता है।

मैंने अपना खुद का कार्यान्वयन लिखने का फैसला किया, लेकिन मुझे वेब सेवा से कच्ची प्रतिक्रिया प्राप्त करने का कोई तरीका नहीं मिला। मैं यह कैसे कर सकता हूं?

उत्तर

58

आप नीचे दिए गए कोड (बेशक आप नेटवर्क प्रतिक्रिया की अधिक जानकारी प्राप्त करने के लिए अनुकूलित कर सकते हैं) का उल्लेख कर सकते हैं:

try { 
    RequestQueue requestQueue = Volley.newRequestQueue(this); 
    String URL = "http://..."; 
    JSONObject jsonBody = new JSONObject(); 
    jsonBody.put("Title", "Android Volley Demo"); 
    jsonBody.put("Author", "BNK"); 
    final String requestBody = jsonBody.toString(); 

    StringRequest stringRequest = new StringRequest(Request.Method.POST, URL, new Response.Listener<String>() { 
     @Override 
     public void onResponse(String response) { 
      Log.i("VOLLEY", response); 
     } 
    }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 
      Log.e("VOLLEY", error.toString()); 
     } 
    }) { 
     @Override 
     public String getBodyContentType() { 
      return "application/json; charset=utf-8"; 
     } 

     @Override 
     public byte[] getBody() throws AuthFailureError { 
      try { 
       return requestBody == null ? null : requestBody.getBytes("utf-8"); 
      } catch (UnsupportedEncodingException uee) { 
       VolleyLog.wtf("Unsupported Encoding while trying to get the bytes of %s using %s", requestBody, "utf-8"); 
       return null; 
      } 
     } 

     @Override 
     protected Response<String> parseNetworkResponse(NetworkResponse response) { 
      String responseString = ""; 
      if (response != null) { 
       responseString = String.valueOf(response.statusCode); 
       // can get more details such as response.headers 
      } 
      return Response.success(responseString, HttpHeaderParser.parseCacheHeaders(response)); 
     } 
    }; 

    requestQueue.add(stringRequest); 
} catch (JSONException e) { 
    e.printStackTrace(); 
} 
+1

शांत आदमी ... आप मेरा दिन बचाते हैं :) –

+1

मेरे लिए बहुत अच्छा काम किया। बहुत बढ़िया हिस्सा! –

+1

इसका काम किया लेकिन bodyContentType और parseNetworkResponse तरीकों – kondal

7

मैं this एक अच्छा लगा, लेकिन यह sending JSON not string के रूप में प्रश्न में अनुरोध है, reposting यहां कोड, मूल जिथब को हटा दिया गया या बदला गया, और यह किसी के द्वारा उपयोगी पाया गया।

public static void postNewComment(Context context,final UserAccount userAccount,final String comment,final int blogId,final int postId){ 
    mPostCommentResponse.requestStarted(); 
    RequestQueue queue = Volley.newRequestQueue(context); 
    StringRequest sr = new StringRequest(Request.Method.POST,"http://api.someservice.com/post/comment", new Response.Listener<String>() { 
     @Override 
     public void onResponse(String response) { 
      mPostCommentResponse.requestCompleted(); 
     } 
    }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 
      mPostCommentResponse.requestEndedWithError(error); 
     } 
    }){ 
     @Override 
     protected Map<String,String> getParams(){ 
      Map<String,String> params = new HashMap<String, String>(); 
      params.put("user",userAccount.getUsername()); 
      params.put("pass",userAccount.getPassword()); 
      params.put("comment", Uri.encode(comment)); 
      params.put("comment_post_ID",String.valueOf(postId)); 
      params.put("blogId",String.valueOf(blogId)); 

      return params; 
     } 

     @Override 
     public Map<String, String> getHeaders() throws AuthFailureError { 
      Map<String,String> params = new HashMap<String, String>(); 
      params.put("Content-Type","application/x-www-form-urlencoded"); 
      return params; 
     } 
    }; 
    queue.add(sr); 
} 

public interface PostCommentResponseListener { 
    public void requestStarted(); 
    public void requestCompleted(); 
    public void requestEndedWithError(VolleyError error); 
} 
संबंधित मुद्दे