【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を使用しています。
とても簡単に使用でき満足です!
