概要
本記事では、JShell(Java Shell Tool)で、REST APIにPOSTアクセスしてみる例を紹介します。
対象読者
- curlでもPowerShellでもREST APIアクセスは簡単だけれども、もしJShellでやったらどうなるのか興味がある方
想定する環境
- 少なくともJava11以上(Java11で追加されたHttpClientを使っています)
記事執筆時の実行環境
以下の通りです。
- Windows 11 Pro 22H2
- jshell 17.0.6 (java 17.0.6 2023-01-17 LTS)
JShellのプログラムでアクセスしてみる
例としてアクセスするAPI
Qiitaの「投稿」リソースで、新規に記事を作成するAPI (https://qiita.com/api/v2/docs#post-apiv2items )を例にJShellのコードを説明します。
このAPIは、POSTアクセスで、所定の内容をリクエストボディに含めて送信することにより、Qiitaの新規記事投稿が実行できるものです。
例では、上記APIドキュメントを参考に、Qiitaの記事を「限定共有記事」として投稿するリクエストを作りました。
JShellのコード
以下のようなコードを書きました。
import java.io.*;
import java.net.*;
import java.net.http.*;
import java.nio.file.*;
import java.util.*;
// if proxy is needed, uncomment these lines.
// System.getProperty("http.proxyHost", "http://your.lovely.proxy.com");
// System.getProperty("http.proxyPort", "8080");
var url = "https://qiita.com/api/v2/items"; // アクセスするAPI
var path = "body.json"; // payload for POST request
var body = Files.readString(Paths.get(path));
var token = "Qiita APIのアクセストークン(別途発行)";
// System.out.println(body);
var client = HttpClient.newHttpClient();
var request = HttpRequest.newBuilder(URI.create(url)).header("Content-Type", "application/json").header("Authorization", "Bearer " + token).POST(HttpRequest.BodyPublishers.ofString(body)).build();
var response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
/ex
基本的には、Javaのコードを順番に並べてあるだけです。
最後の「/ex」は、JShellで外部ファイルを読み込んで実行するとき、最後にJShellを抜けるための命令文です。
var request~の行がとても長くなっていますが、途中で改行を入れるとうまくいかないのでこのような形にしています。
リクエストのボディは以下のようなファイルです。
{
"body": "# Example",
"coediting": false,
"private": true,
"tags": [
{
"name": "Ruby",
"versions": [
"0.0.1"
]
}
],
"title": "Example title",
"tweet": false
}
実行してみる
アクセストークンの発行
Qiitaのアカウント画面で、「設定」を選択し、
今回は記事投稿なので、「read_qiita」「write_qiita」のスコープにチェックを入れ、「発行する」をクリックします。次の画面で(1度だけ)表示されるアクセストークンをメモし、上記プログラム内の「var token」の値として貼り付けます。
実行
何らかのターミナルにて、保存したコード(例:"access-webapi.jshell")と、上記のリクエスト用のボディ(例:"body.json")を同じディレクトリに置き、これらのファイルを格納しているディレクトリにて、以下のように実行します。
jshell access-webapi.jshell
コンソールに、レスポンスのボディが表示されます。
{"rendered_body":"\u003ch1 data-sourcepos=\"1:1-1:9\"\u003e\n\u003cspan (以降略)}
Qiitaの自分の記事の「限定共有記事」に、新しい記事が1つできています。
おわりに
本記事では、JShellで、REST APIにPOSTアクセスする例を紹介しました。
このようなものが役に立つケースはかなりレアだと思いますが、こういうこともできますね、という例としてやってみた内容です。