HttpURLConnection で POST リクエスト

HttpURLConnection で POST リクエストを送信するサンプル。
ボディのデータですが、今回はなんとなく .zip ファイルのバイト配列を書き込むって感じにしてみました。

package test;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;
import java.util.Map;

public class HttpClient {
  public static void main(String[] args) throws Exception {
    URL url = new URL("http://localhost:8080/Tomcat8Test/TestServlet");
    HttpURLConnection con = (HttpURLConnection) url.openConnection();
    
    // (*)
    con.setRequestMethod("POST");
    con.setDoOutput(true);
    byte[] b = Files.readAllBytes(Paths.get("zip/test.zip"));
    OutputStream os = con.getOutputStream();
    os.write(b);
    // (*)
    
    System.out.println("----- Headers -----");
    Map<String, List<String>> headers = con.getHeaderFields();
    for (String key : headers.keySet()) {
      System.out.println(key + ": " + headers.get(key));
    }
    System.out.println();

    System.out.println("----- Body -----");
    BufferedReader reader = new BufferedReader(new InputStreamReader(
        con.getInputStream()));
    String body;
    while ((body = reader.readLine()) != null) {
      System.out.println(body);
    }

    os.close();
    reader.close();
    con.disconnect();
  }
}


リクエスト POST の指定、および、ボディの書き込みは (*) で囲った部分になります。
ボディにデータを書き込む場合、setDoOutput(true) としておく必要があるみたいです。

サーバ側はサーブレットであれば、以下の感じにしてやるとファイルとして保存できます。

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  ServletInputStream sis = request.getInputStream();
  FileOutputStream fos = new FileOutputStream(getServletContext().getRealPath("/") + "test.zip");
  int i;
  while((i = sis.read()) != -1) {
    fos.write(i);
  }
  fos.close();
  response.getWriter().print("TestServlet OK");
}


あんまり需要なさそうかな。。以上です。

[ 環境情報 ]
Windows 7 SP1
Java SE 8 Update 25