【Bukkit Plugin開発】 HTTP通信を実装する
これは Adventar: Bukkit Plugin開発 Advent Calendar 2015 参加記事です。
他の記事もぜひご覧ください。
Bukkit Plugin から HTTP通信 を行うプログラムです。
ただのふつうのJavaプログラム…割と自分用のまとめです。サンプルとして参考にしてください。
機能は
- 簡単なGET通信を行う
- HTTPステータスコードが200かどうか判定する
- レスポンスを出力する
です。
「java.net.HttpURLConnection」を使用して実装しています。
GET通信
<br /> package com.sample.sample_plugin;</p> <p>import java.io.BufferedReader;<br /> import java.io.IOException;<br /> import java.io.InputStreamReader;<br /> import java.net.HttpURLConnection;<br /> import java.net.MalformedURLException;<br /> import java.net.URL;<br /> import java.nio.charset.StandardCharsets;</p> <p>import org.bukkit.Bukkit;</p> <p>public abstract class HttpGetClient {<br /> private final URL url;</p> <p> public HttpGetClient(String url) throws MalformedURLException {<br /> this.url = new URL(url);<br /> }</p> <p> protected abstract void run(String res);</p> <p> public void connect() {<br /> HttpURLConnection connection = null;</p> <p> try {<br /> connection = (HttpURLConnection) url.openConnection();<br /> connection.setRequestMethod("GET");</p> <p> if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {<br /> try (InputStreamReader isr = new InputStreamReader(<br /> connection.getInputStream(), StandardCharsets.UTF_8);<br /> BufferedReader reader = new BufferedReader(isr)) {<br /> String response = new String();<br /> String line;<br /> try {<br /> while ((line = reader.readLine()) != null) {<br /> response += line;<br /> }<br /> run(response);<br /> } catch (IOException e) {<br /> Bukkit.broadcastMessage("えらー");<br /> }<br /> }<br /> } else {<br /> Bukkit.broadcastMessage("えらー");<br /> }<br /> } catch (IOException e) {<br /> Bukkit.broadcastMessage("えらー");<br /> } finally {<br /> if (connection != null) {<br /> connection.disconnect();<br /> }<br /> }<br /> }</p> <p>}<br />
なお、このプログラムではGETパラメータ付きURLを受け取り通信します。
実際に使うのであればGETパラメータの処理をしっかり作ることをお勧めします。
サンプル
せっかくなので、サンプル用のプラグインを作りました。
参考にしてください。
動作
ゲーム画面より「/zip2addr [zipcode]」(zipcodeはxxxxxxxまたはxxx-xxxx形式)と入力し、実行するとサーバからのレスポンスをそのまま表示します。
実際のコード
<br /> name: Zipcode2AddressPlugin<br /> main: net.yk_lab.bukkit.zipcode2addressplugin.Zipcode2AddressPlugin<br /> version: 0.0.1<br /> commands:<br /> zip2addr:<br /> description: Zipcode -> Address.<br /> usage: <command> [zipcode]<br /> permission: NOT_OP<br /> permission-message: You don't have <permission><br />
<br /> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><br /> <modelVersion>4.0.0</modelVersion><br /> <groupId>net.yk_lab.bukkit</groupId><br /> <artifactId>Zipcode2AddressPlugin</artifactId><br /> <version>0.0.1-SNAPSHOT</version><br /> <build><br /> <plugins><br /> <plugin><br /> <groupId>org.apache.maven.plugins</groupId><br /> <artifactId>maven-compiler-plugin</artifactId><br /> <configuration><br /> <source>1.7</source><br /> <target>1.7</target><br /> </configuration><br /> </plugin><br /> </plugins><br /> </build></p> <p> <repositories><br /> <repository><br /> <id>bukkit-repo</id><br /> <url>http://repo.bukkit.org/content/groups/public/</url><br /> </repository><br /> </repositories><br /> <dependencies><br /> <dependency><br /> <groupId>org.bukkit</groupId><br /> <artifactId>bukkit</artifactId><br /> <version>1.7.9-R0.2</version><br /> <type>jar</type><br /> <scope>provided</scope><br /> </dependency><br /> </dependencies><br /> </project><br />
<br /> package net.yk_lab.bukkit.zipcode2addressplugin;</p> <p>import java.net.MalformedURLException;</p> <p>import org.bukkit.command.Command;<br /> import org.bukkit.command.CommandSender;<br /> import org.bukkit.entity.Player;<br /> import org.bukkit.plugin.java.JavaPlugin;</p> <p>public class Zipcode2AddressPlugin extends JavaPlugin {<br /> @Override<br /> public void onEnable() {<br /> // TODO プラグインが有効化された時の処理を実装<br /> }</p> <p> @Override<br /> public void onDisable() {<br /> // TODO プラグインが無効化された時の処理を実装<br /> }</p> <p> public boolean onCommand(CommandSender sender, Command cmd,<br /> String commandLabel, String[] args) {<br /> if (cmd.getName().equalsIgnoreCase("zip2addr")) {<br /> if (!(sender instanceof Player)) {<br /> sender.sendMessage("このコマンドはゲーム内から実行してください。");<br /> } else {<br /> Player player = (Player) sender;<br /> try {<br /> new Zip2Addr("http://zipcloud.ibsnet.co.jp/api/search?zipcode="+args[0], player).connect();;<br /> } catch (MalformedURLException e) {<br /> player.sendMessage("えらー");<br /> } catch (IndexOutOfBoundsException e) {<br /> player.sendMessage("えらー");<br /> }<br /> }<br /> return true;<br /> }<br /> return false;<br /> }<br /> }<br />
<br /> package net.yk_lab.bukkit.zipcode2addressplugin;</p> <p>import java.io.BufferedReader;<br /> import java.io.IOException;<br /> import java.io.InputStreamReader;<br /> import java.net.HttpURLConnection;<br /> import java.net.MalformedURLException;<br /> import java.net.URL;<br /> import java.nio.charset.StandardCharsets;</p> <p>import org.bukkit.Bukkit;</p> <p>public abstract class HttpGetClient {<br /> private final URL url;</p> <p> public HttpGetClient(String url) throws MalformedURLException {<br /> this.url = new URL(url);<br /> }</p> <p> protected abstract void run(String res);</p> <p> public void connect() {<br /> HttpURLConnection connection = null;</p> <p> try {<br /> connection = (HttpURLConnection) url.openConnection();<br /> connection.setRequestMethod("GET");</p> <p> if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {<br /> try (InputStreamReader isr = new InputStreamReader(<br /> connection.getInputStream(), StandardCharsets.UTF_8);<br /> BufferedReader reader = new BufferedReader(isr)) {<br /> String response = new String();<br /> String line;<br /> try {<br /> while ((line = reader.readLine()) != null) {<br /> response += line;<br /> }<br /> run(response);<br /> } catch (IOException e) {<br /> Bukkit.broadcastMessage("えらー");<br /> }<br /> }<br /> } else {<br /> Bukkit.broadcastMessage("えらー");<br /> }<br /> } catch (IOException e) {<br /> Bukkit.broadcastMessage("えらー");<br /> } finally {<br /> if (connection != null) {<br /> connection.disconnect();<br /> }<br /> }<br /> }</p> <p>}<br />
<br /> package net.yk_lab.bukkit.zipcode2addressplugin;</p> <p>import java.net.MalformedURLException;</p> <p>import org.bukkit.entity.Player;</p> <p>public class Zip2Addr extends HttpGetClient {<br /> private Player player;</p> <p> public Zip2Addr(String url, Player player) throws MalformedURLException {<br /> super(url);<br /> this.player = player;<br /> }</p> <p> @Override<br /> protected void run(String res) {<br /> player.sendMessage(res);<br /> }</p> <p>}<br />
実行結果
のようになります。
このままでは見づらいですよね?
実は JSON という形式で返ってきたものをそのまま表示しているためです。
JSON…
そうです、前回の記事に書きました!
Bukkit Plugin 開発では初めから json-simple が使えるので簡単に JSON をあつかうことができます!
なので次回はこの表示を改善したいと思います。
次回
このサンプルプラグインのプログラムを基に、 JSON をパースして表示を整えます!
謝辞
このサンプルプラグインでは、zipcloudを使用しています。
とても簡単に使用でき満足です!