schedule2018-07-28

JavaからJSON文字列をPOSTで送信する

はじめに

APIやサーバとの通信では、多くがJSONの形式です。 そこで、サーバサイドのjavaからJSONを返すテンプレートを作りました。

標準ライブラリのjava.net.HttpURLConnectionを使います。 他に使用するライブラリも標準ものでまとめてあります。

参考 : HttpURLConnectionを使ってPOSTやGETでリクエストするサンプル(proxyも考慮)

プログラム

package HttpRequest;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;

public class HttpSendJSON {
    /**
     * JSON文字列の送信
     * @param strPostUrl 送信先URL
     * @param JSON 送信するJSON文字列
     * @return     
     */
    public String callPost(String strPostUrl, String JSON) {

        HttpURLConnection con = null;
        StringBuffer result = new StringBuffer();
        try {

            URL url = new URL(strPostUrl);
            con = (HttpURLConnection) url.openConnection();
            // HTTPリクエストコード
            con.setDoOutput(true);
            con.setRequestMethod("POST");
            con.setRequestProperty("Accept-Language", "jp");
            // データがJSONであること、エンコードを指定する
            con.setRequestProperty("Content-Type", "application/JSON; charset=utf-8");
            // POSTデータの長さを設定
            con.setRequestProperty("Content-Length", String.valueOf(JSON.length()));
            // リクエストのbodyにJSON文字列を書き込む
            OutputStreamWriter out = new OutputStreamWriter(con.getOutputStream());
            out.write(JSON);
            out.flush();
            con.connect();

            // HTTPレスポンスコード
            final int status = con.getResponseCode();
            if (status == HttpURLConnection.HTTP_OK) {
                // 通信に成功した
                // テキストを取得する
                final InputStream in = con.getInputStream();
                String encoding = con.getContentEncoding();
                if (null == encoding) {
                    encoding = "UTF-8";
                }
                final InputStreamReader inReader = new InputStreamReader(in, encoding);
                final BufferedReader bufReader = new BufferedReader(inReader);
                String line = null;
                // 1行ずつテキストを読み込む
                while ((line = bufReader.readLine()) != null) {
                    result.append(line);
                }
                bufReader.close();
                inReader.close();
                in.close();
            } else {
                // 通信が失敗した場合のレスポンスコードを表示
                System.out.println(status);
            }

        } catch (Exception e1) {
            e1.printStackTrace();
        } finally {
            if (con != null) {
                // コネクションを切断
                con.disconnect();
            }
        }
        return result.toString();
    }
}

使用方法

簡単なログイン認証のサンプルを例示します。パッケージ名などは任意で変更して下さい。

package HttpRequest;

public class Main {

    public static void main(String[] args) {
        // 送信先URL
        String strPostUrl = "http://{hostname}/api/login/";
        // アカウント情報のJSON文字列
        String JSON = "{"account":"hoge", "passwd":"piyo"}";
        // 認証
        HttpSendJSON httpSendJSON = new HttpSendJSON();
        String result = httpSendJSON.callPost(strPostUrl, JSON);
        // 結果の表示
        System.out.println(result);
    }

}

対向試験用

送信先の処理はphpで作成しました。レスポンスもJSONで返すようにしています。

<?php
// リクエストのbodyを取り出す。
$JSON_string = file_get_contents('php://input');
// JSON文字列を変換。arrayにするためにはtrueが必要です。
$JSON_array = JSON_decode($JSON_string,true);

// レスポンスの形式を指定
header("Content-Type: application/JSON; charset=utf-8");
// アカウント情報と比較
$account = "hoge";
$passwd = "piyo";
if (strcasecmp($account, $JSON_array['account']) == 0 &&
    strcasecmp($passwd, $JSON_array['passwd']) == 0) {
    // 認証成功
    // tokenと認証成功であることを返す。
    echo '{"result":"success", "token":"xxxxxxxxxx"}';
}
else {
    // 認証失敗
    echo '{"result":"faiiure"}';
}

おわりに

VSCodeでJavaの開発環境を構築する方法をまとめました。


書籍紹介

新入社員として初めてJavaとサーブレットを勉強していた時、この3冊に大変お世話になりました。 仕事で使う技術の基礎が体系的にまとまっていています。 まずはこの3冊の中でわからないところを読み込んだり調べたりして学べば、成長できるのではと思います。