【Bukkit Plugin開発】 HTTP通信を実装する

これは Adventar: Bukkit Plugin開発 Advent Calendar 2015 参加記事です。
他の記事もぜひご覧ください。

Bukkit Plugin から HTTP通信 を行うプログラムです。
ただのふつうのJavaプログラム…割と自分用のまとめです。サンプルとして参考にしてください。

機能は

  • 簡単なGET通信を行う
  • HTTPステータスコードが200かどうか判定する
  • レスポンスを出力する

です。

「java.net.HttpURLConnection」を使用して実装しています。

GET通信

package com.sample.sample_plugin;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.nio.charset.StandardCharsets;

import org.bukkit.Bukkit;

public abstract class HttpGetClient {
	private final URL url;
	
	public HttpGetClient(String url) throws MalformedURLException {
		this.url = new URL(url);
	}
	
	protected abstract void run(String res);
	
	public void connect() {
	    HttpURLConnection connection = null;
	 
	    try {
	        connection = (HttpURLConnection) url.openConnection();
	        connection.setRequestMethod("GET");
	 
	        if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {
	            try (InputStreamReader isr = new InputStreamReader(
	                    connection.getInputStream(), StandardCharsets.UTF_8);
	                    BufferedReader reader = new BufferedReader(isr)) {
					String response = new String();
					String line;
					try {
						while ((line = reader.readLine()) != null) {
							response += line;
						}
						run(response);
					} catch (IOException e) {
			        	Bukkit.broadcastMessage("えらー");
					}
	            }
	        } else {
	        	Bukkit.broadcastMessage("えらー");
	        }
	    } catch (IOException e) {
        	Bukkit.broadcastMessage("えらー");
	    } finally {
	        if (connection != null) {
	            connection.disconnect();
	        }
	    }
	}

}

なお、このプログラムではGETパラメータ付きURLを受け取り通信します。
実際に使うのであればGETパラメータの処理をしっかり作ることをお勧めします。

サンプル

せっかくなので、サンプル用のプラグインを作りました。
参考にしてください。

動作

ゲーム画面より「/zip2addr [zipcode]」(zipcodeはxxxxxxxまたはxxx-xxxx形式)と入力し、実行するとサーバからのレスポンスをそのまま表示します。

実際のコード

name: Zipcode2AddressPlugin
main: net.yk_lab.bukkit.zipcode2addressplugin.Zipcode2AddressPlugin
version: 0.0.1
commands:
   zip2addr:
      description: Zipcode -> Address.
      usage: <command> [zipcode]
      permission: NOT_OP
      permission-message: You don't have <permission>
<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">
  <modelVersion>4.0.0</modelVersion>
  <groupId>net.yk_lab.bukkit</groupId>
  <artifactId>Zipcode2AddressPlugin</artifactId>
  <version>0.0.1-SNAPSHOT</version>
	<build>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<configuration>
					<source>1.7</source>
					<target>1.7</target>
				</configuration>
			</plugin>
		</plugins>
	</build>

	<repositories>
		<repository>
			<id>bukkit-repo</id>
			<url>http://repo.bukkit.org/content/groups/public/</url>
		</repository>
	</repositories>
	<dependencies>
		<dependency>
			<groupId>org.bukkit</groupId>
			<artifactId>bukkit</artifactId>
			<version>1.7.9-R0.2</version>
			<type>jar</type>
			<scope>provided</scope>
		</dependency>
	</dependencies>
</project>
package net.yk_lab.bukkit.zipcode2addressplugin;

import java.net.MalformedURLException;

import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;

public class Zipcode2AddressPlugin extends JavaPlugin {
	@Override
	public void onEnable() {
		// TODO プラグインが有効化された時の処理を実装
	}

	@Override
	public void onDisable() {
		// TODO プラグインが無効化された時の処理を実装
	}

	public boolean onCommand(CommandSender sender, Command cmd,
			String commandLabel, String[] args) {
		if (cmd.getName().equalsIgnoreCase("zip2addr")) {
			if (!(sender instanceof Player)) {
				sender.sendMessage("このコマンドはゲーム内から実行してください。");
			} else {
				Player player = (Player) sender;
				try {
					new Zip2Addr("http://zipcloud.ibsnet.co.jp/api/search?zipcode="+args[0], player).connect();;
				} catch (MalformedURLException e) {
					player.sendMessage("えらー");
				} catch (IndexOutOfBoundsException e) {
					player.sendMessage("えらー");
				}
			}
			return true;
		}
		return false;
	}
}
package net.yk_lab.bukkit.zipcode2addressplugin;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.nio.charset.StandardCharsets;

import org.bukkit.Bukkit;

public abstract class HttpGetClient {
	private final URL url;
	
	public HttpGetClient(String url) throws MalformedURLException {
		this.url = new URL(url);
	}
	
	protected abstract void run(String res);
	
	public void connect() {
	    HttpURLConnection connection = null;
	 
	    try {
	        connection = (HttpURLConnection) url.openConnection();
	        connection.setRequestMethod("GET");
	 
	        if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {
	            try (InputStreamReader isr = new InputStreamReader(
	                    connection.getInputStream(), StandardCharsets.UTF_8);
	                    BufferedReader reader = new BufferedReader(isr)) {
					String response = new String();
					String line;
					try {
						while ((line = reader.readLine()) != null) {
							response += line;
						}
						run(response);
					} catch (IOException e) {
			        	Bukkit.broadcastMessage("えらー");
					}
	            }
	        } else {
	        	Bukkit.broadcastMessage("えらー");
	        }
	    } catch (IOException e) {
        	Bukkit.broadcastMessage("えらー");
	    } finally {
	        if (connection != null) {
	            connection.disconnect();
	        }
	    }
	}

}
package net.yk_lab.bukkit.zipcode2addressplugin;

import java.net.MalformedURLException;

import org.bukkit.entity.Player;

public class Zip2Addr extends HttpGetClient {
	private Player player;
	
	public Zip2Addr(String url, Player player) throws MalformedURLException {
		super(url);
		this.player = player;
	}

	@Override
	protected void run(String res) {
		player.sendMessage(res);
	}

}

実行結果

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

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

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

次回

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

謝辞

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

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