読者です 読者をやめる 読者になる 読者になる

原始的なHTTPクライアントサンプル

久々に 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 で出すサンプル。