久々に HTTPクライアントプログラムを書く。
以前は https://hc.apache.org/ を使うことばかりしていた。chunk発生を考慮すれば当然だった。
でも、限られたネットワークで軽量に動かしたく前にも書いたかもしれない 原始的なHTTP クライアント
(=他のライブラリを使わない、java.net.HttpURLConnection でなんとかする)のサンプルを改めて書き直した。
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.HttpURLConnection; import java.net.URL; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** * Sample. */ public class SampleClient { /** * @param path URLのパス * @param parameters POST送信パラメータ、key-value */ public String execute(String path, Map<String, String> parameters){ String result = null; try{ URL url = new URL(path); HttpURLConnection uc = (HttpURLConnection)url.openConnection(); uc = (HttpURLConnection)url.openConnection(); /* HTTPリクエストヘッダの設定 */ uc.setDoOutput(true); // こちらからのデータ送信を可能とする uc.setReadTimeout(0); // 読み取りタイムアウト値をミリ秒単位で設定(0は無限) uc.setRequestMethod("POST"); // URL 要求のメソッドを設定 String sendstring = parameters.entrySet().stream().map(e->e.getKey() + "=" + e.getValue()).collect(Collectors.joining("&")); uc.setRequestProperty("Content-Length",Integer.toString(sendstring.getBytes("utf8").length)); // コネクション確立→送信 uc.connect(); OutputStreamWriter osw = new OutputStreamWriter(uc.getOutputStream(), "utf8"); osw.write(sendstring); osw.flush(); // 戻り値取得 System.out.println("ContentType: " + uc.getContentType()); Map<String,List<String>> hmap = uc.getHeaderFields(); List<String> hlist = hmap.get("Content-Language"); if (hlist != null && hlist.size()==1){ System.out.println("ContentLanguage: " + hlist.get(0) ); } hlist = hmap.get("Date"); if (hlist != null && hlist.size()==1){ System.out.println("ContentDate: " + hlist.get(0) ); } hlist = hmap.get("Content-Length"); if (hlist != null && hlist.size()==1){ System.out.println("ContentLength: " + hlist.get(0) ); } System.out.println("ResponseCode: " + uc.getResponseCode() ); System.out.println("ResponseMessage: " + uc.getResponseMessage() ); try(BufferedReader in = new BufferedReader(new InputStreamReader(uc.getInputStream(), "utf8")) ){ StringBuffer out = new StringBuffer(); char[] buf = new char[1024]; int n; while((n = in.read(buf)) >= 0){ out.append(buf, 0, n); } result = out.toString(); }catch(IOException e){ throw new RuntimeException(e); }finally{ } }catch(Exception e){ e.printStackTrace(); }finally{ } return result; } }
あえて、途中、標準出力で状況を出している。例外もprintStackTrace で出すサンプル。