PutメソッドのHTTP通信を使用してボディーにKey/Valueパラメータを渡す方法を探しています。
BodyにKey/Valueのパラメータを設定して、受け渡し先で
String value = request.get~("Key");
みたいな感じで取得できる様な渡し方ができたらと考えております。。
現在、下記方法でサーブレット内でHttp通信を実装しようとしておりますが、
Key/Valueで取得できる方法が見つからず、困っております。
【方法】
①ApacheのHttpClientクラス、PutMethodクラスを使用する方法
②HttpURLConnectionを使用する方法
【実装ソース】
①HttpClientクラス、PutMethodクラスを使用する方法
■送信側
lang
1 2public class HttpClientFrom extends HttpServlet { 3 4 @Override 5 public void doGet(HttpServletRequest req, HttpServletResponse resp) 6 throws ServletException, IOException { 7 8 System.out.println(this.getClass().toString() + "▼処理開始▼"); 9 10 URL url = new URL("http://localhost:8080/DymmyRenkei/HttpClientTo"); 11 12 HttpClient client = new HttpClient(); 13 PutMethod method = new PutMethod(url); 14 15 // String文字列として&区切りでボディに設定するが受信側でKey/Value形式で取得できない。。。 16 String entity = "test=bob&fruits=apples&hoge=こんにちは"; 17 RequestEntity et = new StringRequestEntity(entity, null, "UTF-8"); 18 19 method.setRequestEntity(entity); 20 21 // 複数文字列をKey, Value形式で設定するが受信側の取得方法が不明。。。 22 Part[] parts = { 23 new StringPart("hogePart","こんにちはパート"), 24 new StringPart("testPart","テスト文字列") 25 }; 26 method.setRequestEntity(new MultipartRequestEntity(parts, method.getParams())); 27 28 int statusCode = client.excuteMethod(method); 29 System.out.println(statusCode); 30 System.out.println(this.getClass().toString() + "▲処理終了▲"); 31 } 32}
■受信側
※略:getInputStreamでBody部を読みこめば、
取得できることは確認できていますが、get~("Key")形式で取得する実装が実現できていない状況
②HttpURLConnectionを使用する方法
■送信側
lang
1public class ServletFrom extends HttpServlet { 2 3 @Override 4 public void doGet(HttpServletRequest req, HttpServletResponse resp) 5 throws ServletException, IOException { 6 7 System.out.println(this.getClass().toString() + "▼処理開始▼"); 8 9 URL url = new URL("http://localhost:8080/DymmyRenkei/To"); 10 11 HttpURLConnection con = (HttpURLConnection)url.openConnection(); 12 con.setRequestMethod("PUT"); 13 con.setInstanceFollowRedirects(false); 14 con.setRequestProperty("Content-Type","application/x-www-form-urlencoded;charset=UTF-8"); 15 // setRequestPropertyでセットした値は送り先で取得できない... そもそも概念が違う? 16 con.setRequestProperty("key", "value"); 17 con.setDoOutput(true); 18 19 PrintStream ps = new PrintStream(con.getOutputStream()); 20 // ボディに" &区切りKey=Valued "で設定しても送り先でget系メソッドを使用して取得することはできない? 21 ps.print("test=bob&fruits=apples&hoge=こんにちは"); 22 23 con.connect(); 24 25 int st = con.getResponseCode(); 26 System.out.println(st); 27 28 System.out.println(this.getClass().toString() + "▲処理終了▲"); 29 30 31 32 } 33 34 35} 36
■受信側
lang
1 2public class ServletTo extends HttpServlet { 3 4 @Override 5 public void doPut(HttpServletRequest req, HttpServletResponse resp) 6 throws ServletException, IOException { 7 8 System.out.println(this.getClass().toString() + "▼処理開始▼"); 9 BufferedReader in; 10 in = new BufferedReader(new InputStreamReader(req.getInputStream())); 11 12 String line; 13 // Bodyに書き込んだ文字列がそのまま取れることは確認済み。加工しないとだめ? また、日本語がもじバケる現象 14 while((line = in.readLine()) != null){ 15 System.out.println(line); 16 } 17 18 in.close(); 19 20 // bodyに&区切りで入れたデータが取れるかと思ったが取れない... 21 System.out.println(req.getParameter("test")); 22 System.out.println(req.getParameter("fruits")); 23 System.out.println(req.getParameter("hoge")); 24 25 // setRequestPropertyで設定した値はこれでは取れない... 26 System.out.println(req.getParameter("key")); 27 28 29 resp.setStatus(200); 30 OutputStream out = resp.getOutputStream(); 31 out.write("★成功★".getBytes()); 32 33 34 35 System.out.println(this.getClass().toString() + "▲処理終了▲"); 36 37 } 38 39}
分かっていること
- ヘッダー部であれば①、②の方法でKey/Valueで設定し取得できることを確認
- HttpClientとPostMechodクラスであれば、addParameter("K","V")があるのでBody部にパラメータとして渡せること(putは無理なのかな)
質問内容
- Putメソッドでボディー部にKey/Valueパラメータを設定して渡す方法があるかどうか(Body部に一定の形式(JSON、区切り文字等)で送ることを受信先と認識合わせしないとダメ?)
- ①の実装で受信側で文字化けを起こさない様な送信側、受信側の実装方法が知りたい(Charsetにセットする文字列をあわせるとか?)
- ①、②の受信側の実装方法の具体例が知りたい(そもそも一般的に上記の様な実装であってるか不安。。)
- 本件、参考になるURLがあれば知りたい。(いろんなサイトを拝見したのですが該当せず、英語のAPIを眺めても解決に至りませんでした。。)
箇条書きでいくつもすみません。
上記ご教示の程宜しくお願い致します。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/07/10 08:57
2016/07/11 01:43