まよいのちはれ

まよいのちはれ

迷えるあなたに癒しと解決案を…。

JavaのSpringを使って、外部APIからJSON形式でデータを受け取るAPIを自作してみる

皆様、こんばんは。NaaaOです!

 

GoogleのMapやらホットペッパーの店の情報を取得するなど便利なAPIですが、今回はJavaの環境下で何かしらのAPIを通じて送られてきた情報をコンソールに出すAPIを自作したいなと思います。

 

自分が初心者なので、初心者向けです。

 

 

 

Java周りの環境

 

統合開発環境:eclipse

プラグイン :STS(Spring Tool Suite3.9.5)

サーバー  :tomcat8

SQL    :Microsoft SQL Server 2018

 

IDEと呼ばれる統合開発環境はeclipseです。

 

 

アノテーションを使うために、

プラグインとしてSpringを使ってます。

 

 

アノテーションとは

直訳すると、「注記」という意味になります。

 

プログラミングの世界でも「ここはこーゆー処理をする場所」と書き留めておくようなイメージになります。

 

また、アノテーションはテータの有無、データの数によって3種類に分かれます。

 

名前だけでデータのないマーカー 例:@Override、@Deprecated

データをひとつ持つ単一アノテーション 例:@SuppressWarning

複数のデータをもつフルアノテーション

 

参考:https://www.sejuku.net/blog/22694

 

 

今回は、RESTfulなwebサービス構築でよく使われる

 

 

・@Pathアノテーション

 (アクセスするためのパス(≒URIの一部)を定義)

・@GETアノテーション

 (データの取得に使用)

・@Producesアノテーション

 (返却するデータの種類を指定)

・@QueryParamアノテーション

 (クエリストリングとメソッドの引数を関連付ける)

 

 

を使って外部のAPIにURLでリクエストを送り、

JSON形式でデータをもらうAPIを作りたいと思います!

 

 

実際のコード

@Path("クラスの名前")
public class ShopSearch {

@GET
@Produces("application/json")
public String shopAndKuchikomiSearch(@QueryParam("受け取りたい情報") String str) {

// クライアントから受け取ったパラメータをキーに、Hotpepper APIから店舗情報を取得する。(変数とかは自分で設定)
String urlString = "外部API"
+ str
+ "&format=json";


//try-catchで囲む
try {
URL url = new java.net.URL(urlString);

//HttpURLCOnnection型にキャスト
HttpURLConnection con = (HttpURLConnection)url.openConnection();
//URL要求のメソッドをGETする
con.setRequestMethod("GET");
//通信リンクを確立
con.connect();

//この接続からの入力を受け取る入力ストリームを返す
InputStream stream = con.getInputStream();
//文字列のバッファを構築
StringBuffer sb = new StringBuffer();
String line = "";
//文字型入力ストリームを作成
BufferedReader br = new BufferedReader(new InputStreamReader(stream));
//読めなくなるまでwhile文で回す
while*1 != null) {

sb.append(line);

}
stream.close();
String script = sb.toString();

//ObjectMapperオブジェクトの宣言
ObjectMapper mapper = new ObjectMapper();

//JSON形式をクラスオブジェクトに変換
JsonNode node = mapper.readTree(script).get("results").get("shop");

 //クラスオブジェクトの中から必要なものだけを取りだす
    String name = node.get(i).get("name").asText();
    String city = node.get(i).get("address").asText();

 

//名前を表示

system.println.out(name);

 

return str;

 

解説

RESTfulなAPIを想定しているので、他のプロジェクトからパスを通すことを前提としています。

 

 

大まかな流れとしては、

 

1.パスを作る

2.APIとの接続を確立

3.APIから受け取った情報を文字列で所持

4.JSON形式をクラスオブジェクトに変換し、取り出す

 

っていったような感じです。

 

個人的に注意した点は、

1番と4番ですかね。

 

僕の環境では、1番のパスを受け取る段階で

http://localhost:ポート番号/プロジェクト名/バージョン/クラス名?受け取りたい情報

 

のパスのAPIを他のプロジェクトからGETするという構造なのですが、@Pathの部分を最初間違えて投げたいほうのパスを書いちゃってました。

 

 

あとは、JsonNode型だとネストされたJSON型のデータがとりやすいみたいです。

 

ここのgetの仕方も少し躓きました。。

(ネスト構造を読み取ることが重要っぽいです)

 

 

最終的にこんな感じで受け取ることができました(今回はホットペッパーAPI)

 

f:id:NaaaO-nogi:20190717020226p:plain

 

 

一番上のがJSON形式でデータを受け取ったものになります!

その中から名前だけをsysoutしてます!!

(下のは気にしないでください。。)

 

まとめ

 

APIを利用することで、RESTfulなサービスを構築しやすくなるらしいです。

 

 

拡張性・耐障害性などが広がるらしいのでぜひこれから積極的に使っていきたいなと思います!!

 

 

 

 

 

 

ではでは

*1:line = br.readLine(