【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(&quot;GET&quot;);</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(&quot;えらー&quot;);<br />
					}<br />
	            }<br />
	        } else {<br />
	        	Bukkit.broadcastMessage(&quot;えらー&quot;);<br />
	        }<br />
	    } catch (IOException e) {<br />
        	Bukkit.broadcastMessage(&quot;えらー&quot;);<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 -&gt; Address.<br />
      usage: &lt;command&gt; [zipcode]<br />
      permission: NOT_OP<br />
      permission-message: You don't have &lt;permission&gt;<br />

<br />
&lt;project xmlns=&quot;http://maven.apache.org/POM/4.0.0&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot; xsi:schemaLocation=&quot;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd&quot;&gt;<br />
  &lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt;<br />
  &lt;groupId&gt;net.yk_lab.bukkit&lt;/groupId&gt;<br />
  &lt;artifactId&gt;Zipcode2AddressPlugin&lt;/artifactId&gt;<br />
  &lt;version&gt;0.0.1-SNAPSHOT&lt;/version&gt;<br />
	&lt;build&gt;<br />
		&lt;plugins&gt;<br />
			&lt;plugin&gt;<br />
				&lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;<br />
				&lt;artifactId&gt;maven-compiler-plugin&lt;/artifactId&gt;<br />
				&lt;configuration&gt;<br />
					&lt;source&gt;1.7&lt;/source&gt;<br />
					&lt;target&gt;1.7&lt;/target&gt;<br />
				&lt;/configuration&gt;<br />
			&lt;/plugin&gt;<br />
		&lt;/plugins&gt;<br />
	&lt;/build&gt;</p>
<p>	&lt;repositories&gt;<br />
		&lt;repository&gt;<br />
			&lt;id&gt;bukkit-repo&lt;/id&gt;<br />
			&lt;url&gt;http://repo.bukkit.org/content/groups/public/&lt;/url&gt;<br />
		&lt;/repository&gt;<br />
	&lt;/repositories&gt;<br />
	&lt;dependencies&gt;<br />
		&lt;dependency&gt;<br />
			&lt;groupId&gt;org.bukkit&lt;/groupId&gt;<br />
			&lt;artifactId&gt;bukkit&lt;/artifactId&gt;<br />
			&lt;version&gt;1.7.9-R0.2&lt;/version&gt;<br />
			&lt;type&gt;jar&lt;/type&gt;<br />
			&lt;scope&gt;provided&lt;/scope&gt;<br />
		&lt;/dependency&gt;<br />
	&lt;/dependencies&gt;<br />
&lt;/project&gt;<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(&quot;zip2addr&quot;)) {<br />
			if (!(sender instanceof Player)) {<br />
				sender.sendMessage(&quot;このコマンドはゲーム内から実行してください。&quot;);<br />
			} else {<br />
				Player player = (Player) sender;<br />
				try {<br />
					new Zip2Addr(&quot;http://zipcloud.ibsnet.co.jp/api/search?zipcode=&quot;+args[0], player).connect();;<br />
				} catch (MalformedURLException e) {<br />
					player.sendMessage(&quot;えらー&quot;);<br />
				} catch (IndexOutOfBoundsException e) {<br />
					player.sendMessage(&quot;えらー&quot;);<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(&quot;GET&quot;);</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(&quot;えらー&quot;);<br />
					}<br />
	            }<br />
	        } else {<br />
	        	Bukkit.broadcastMessage(&quot;えらー&quot;);<br />
	        }<br />
	    } catch (IOException e) {<br />
        	Bukkit.broadcastMessage(&quot;えらー&quot;);<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 />

実行結果

「/zip2addr 0010010」と実行してみると…
Zipcode2Address実行結果

のようになります。
このままでは見づらいですよね?
実は JSON という形式で返ってきたものをそのまま表示しているためです。

JSON…
そうです、前回の記事に書きました!
Bukkit Plugin 開発では初めから json-simple が使えるので簡単に JSON をあつかうことができます!
なので次回はこの表示を改善したいと思います。

次回

このサンプルプラグインのプログラムを基に、 JSON をパースして表示を整えます!

謝辞

このサンプルプラグインでは、zipcloudを使用しています。
とても簡単に使用でき満足です!

コメント
トラックバック
ページトップへ