2015-11-06 2 views
18

私が書いたRESTful Webサービスと通信するAndroidアプリを開発しています。 GETメソッドにVolleyを使用するのはすばらしく簡単ですが、私はPOSTメソッドに私の指を置くことはできません。ボリス本体を使用してボレーを使用してPOSTリクエストを送信するにはどうすればよいですか?

私はリクエストのボディにStringPOSTリクエストを送信し、(200 ok500 server errorなど)、Webサービスの生の応答を取得します。

私が見つけたのは、データ(本文)とともに送信できないStringRequestです。また、それは、構文解析されたString応答を受け取ることができます。 私はJsonObjectRequestを受け取り、データ(本文)を受け取りましたが、解析済みのJSONObject応答を取得しました。

独自の実装を作成することにしましたが、Webサービスから生の応答を受け取る方法が見つかりません。どうしたらいいですか?

答えて

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

ITSは働いたが、 'parseNetworkResponse' – kondal

7

私はthisものを言っていますが、問題の要求通り、それは再ポスト、sending JSON not stringです元のギブスが削除されたり変更されたりした場合に備えて、ここのコードは、誰かが役に立つと判断したものです。

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); 
} 
関連する問題