NEMAPIの使い方（初心者向け）

![NEMAPI使い方.png](https://qiita-image-store.s3.amazonaws.com/0/213968/3d03c0ce-1683-a12a-7a8b-c9e457de77a8.png)

##**概要**
NEM APIを使って、
なんか開発してみたいけど、
何から始めれば良いか分からない
という方向けに、
NEM APIの使い方を書いてみます。

追記)NEMAPIを提供するのはスーパーノードだと書きましたが、スーパーノードでないノードもapi提供してるかもしれないです。すみません確認します。
###**参考**
[こちら](https://cryptocurrency.muragon.com/entry/10.html)の記事を参考にしました。

###**APIとは**
APIは提供されているサービスの機能を
インターネットを通じて、
皆と共有(シェア)する時に用いられます。

###**NEMのAPI**
NEMのAPIでは、
NEMブロックチェーンでできる多くの機能を
誰でも利用することができます。

##**とりあえず使ってみる**
NEM APIについて、
手っ取り早く理解するには、
実際に使ってみるのが一番早いです。

###**リクエスト**
ブラウザで以下のURLをリクエストしてみると、
http://alice2.nem.ninja:7890/account/get?address=NDBWWVBH4AK76CYZ6MICVOGVXOGNVIH2KINSVLFU

###**レスポンス**
謎の文字列が返ってきます。

```json
{"meta":{"cosignatories":[],"cosignatoryOf":[],"status":"LOCKED","remoteStatus":"INACTIVE"},"account":{"address":"NDBWWVBH4AK76CYZ6MICVOGVXOGNVIH2KINSVLFU","harvestedBlocks":0,"balance":39000000,"importance":0.0,"vestedBalance":36958947,"publicKey":null,"label":null,"multisigInfo":{}}}
```


これがNEM APIです。


~~ 完 ~~

##**レスポンスの詳細**
もう少し詳しく説明します。
返ってきた謎の文字列をじっくりみてみます。

###**JSON形式**
謎の文字列は、JSONという形式で書かれてます。
JSONはデータを表現するための記法の一つです。

###**NEM用語**
このJSONデータをよくみると、
NEMの用語がいくつかあることが分かります。
address、harvestedBlocks、balance、importance...
NEM用語については[こちら](http://mijin.io/forums/forum/%E6%97%A5%E6%9C%AC%E8%AA%9E/243-mijin-%E7%94%A8%E8%AA%9E%E9%9B%86%EF%BC%86%E5%8F%82%E8%80%83%E6%9B%B8)のサイトが良くまとまっています。



###**NEMアカウントの情報**
これはNEMのアカウント(アドレス)が所有する情報です。
以下の情報が読み取れます。（他にも要素はありますが省略します。）


| 要素              |  値                                      |
|:-----------------:|:----------------------------------------:|
| address          |  NDBWWVBH4AK76CYZ6MICVOGVXOGNVIH2KINSVLFU |
| harvestedBlocks  |  0                                        |
| balance          |  39000000                                 |
| importance       |  0.0                                      |

###**address**
NEMのアドレスです。
このアドレスはNDBWWVBH4AK76CYZ6MICVOGVXOGNVIH2KINSVLFUです。
銀行の口座番号のようなものです。
######**mainnetとtestnetとmijin**
ちなみに、
NEMに関するアドレスには、
mainnet、testnet、mijinがあります。
mainnetは頭文字がNから始まり、testnetはTから、mijinはMから始まります。

###**HarvestedBlocks(ハーベスト回数)**
これまでのハーベスト回数です。
0回であることが分かります。

###**balance(残高)**
balanceはXEMの残高を表します。
このアドレス(NDBWWVBH4AK76CYZ6MICVOGVXOGNVIH2KINSVLFU)は、
39XEM保持していることが分かります。（1000000分の1します）

###**Importance(重要度)**
PoIの重要度です。
0.0であることが分かります。

##**リクエストの詳細**

始めにリクエストしたURLを
意味ごとに分割してみると、
以下のようになります。

|  通信方式  |  ホスト名（ノード）     |     ポート番号     |        APIパス          |  アカウント(アドレス)|
|:---------:|:--------:|:-----------:|:----------------:|:----------------:|  
| http:// |  alice2.nem.ninja  |  :7890  | /account/get  |  ?address=【任意のアドレス】 |

###**通信方式**
データを送受信するための方式です。
httpはwebページ等のデータを送受信する時に使われるプロトコルです。
よりセキュアにwebデータを送るためのプロトコルにhttpsもあります。

###**ホスト名(ノード)**
NEM APIのリクエストにはノード(NIS)が対応します。
ここで、どのノードにリクエストを送るか指定します。
[このサイト](https://supernodes.nem.io/)からスーパーノード一覧を見ることができます。


######**mainnetとtestnet**
NEMブロックチェーンのネットワークには
mainnet(実際に利用されるネットワーク)と
testnet(実験や開発環境として利用されるネットワーク)があります。
mainnetかtestnetでapiが利用できるスーパーノードも異なるので注意です。

######**接続するノードの分散**
毎回同じノードにリクエストを送り続けるのは良くないです。
NEMのサービスを開発する時は、
接続するノードを分散させる工夫が必要です。
また、ファイアウォールの設定でアクセスできないノードもあるので注意です。


###**ポート番号**
データ通信の種類を識別するために用いられる番号です。
NEMapiのデータはポート番号7890が用いられるのが一般的です。

###**APIパス**
ここでNEMに関する、どんな情報を取得したいか送りたいかを指定します。
以下によく使いそうな例をリストにします。
より詳しく知りたい方は[こちら](https://www.pr1sm.com/crypto-coin/nem-nis-api-documentation-in-japanese/)

|  APIパス  |  概要     | 
|:---------:|:--------|
| /heartbeat |  NIS(SN)が稼動しているかどうかを判断します。  | 
| /account/get |  アカウントのデータ(AccountMetaDataPair)を取得します。  |
| /account/harvests |  アカウントの収穫情報オブジェクトの配列を取得します。  |
| /account/mosaic/owned |  アカウントが所有するモザイク情報を取得します。  |
| /account/transfers/incoming |  アカウントが受信したトランザクションデータを最新のものから25個取得します。（？）  | 
| /account/transfers/outgoing |  アカウントが送信したトランザクションデータを最新のものから25個取得します。（？）  | 
| /account/transfers/all |  アカウントが送受信したトランザクションデータを最新のものから25個取得します。（？）  |
| /account/unconfirmedTransactions |  アカウントが送信者または受信者であり、まだブロックに含まれていないトランザクションの配列を取得します。  |
| /chain/height |  ブロックチェーンの現在の高さを取得します。  |

###**アカウント(アドレス)**
アドレスの指定をします。
?address=
の後にアドレスを指定します。
ハイフンを除いた状態で指定することに注意してください。

######**任意のアドレス情報を取得する**
【任意のアドレス】に利用したいアドレスを入力すれば、
そのアドレスに関する情報を閲覧できます。
http://alice2.nem.ninja/account/get?address=【任意のアドレス】

##**まとめ**
プログラミング経験もそこまでない方(僕のような)だと、
NEM APIを使ってみたいがどうすれば良いのか
さっぱりわからないと思います。
しかし、実はNEM APIを使うことそれ自体は
とても簡単で、
決められたURLを送るだけです。

問題は、
このAPIを使ってどうサービスを設計するか、
プログラミングしていくか、
というところが一番大変です。

###**今後**
NEM APIについて理解できた後は、
さっそく簡単なものから、
作ってみるのが良いです。

例えば、Faucetや掲示板です。
この二つは今までに多くの方が作ってみている印象があります。
そのぶん、ネット上に情報が多く存在しているので、作りやすいと思います。

##**開発で役立つNEMの技術系資料**
僕が、NEM APIを使って開発する時に利用した資料を紹介します。

@nem_takanobuさんの記事
主に、javascriptでのNEM APIを使う方法が書かれています。@nem_takanobuさんの記事は一通り目を通すことをおすすめします。

[nem advent calender 2017](https://qiita.com/advent-calendar/2017/nem)
NEMのアドベントカレンダーです。こちらもたくさんの方がNEMに関する記事を書いてくださっています。

[技術・開発資料](http://mijin.io/forums/forum/%E6%97%A5%E6%9C%AC%E8%AA%9E/nem/2362-%E6%8A%80%E8%A1%93%E3%83%BB%E9%96%8B%E7%99%BA%E8%B3%87%E6%96%99%E7%B3%BB)
NEMの技術系資料はこのサイトにほとんどまとまっています。

###**NEMの基本的知識**
NEMに関する非技術的な知識を身に着けたい人向けにおすすめのNEM記事を
[こちら](https://cryptstudent.com/2018/01/10/%E4%BD%95%E5%BA%A6%E3%82%82%E8%AA%AD%E3%81%BF%E8%BF%94%E3%81%97%E3%81%9F%E3%81%84%E4%BB%AE%E6%83%B3%E9%80%9A%E8%B2%A8%E8%A8%98%E4%BA%8B%E3%81%BE%E3%81%A8%E3%82%81/)にまとめてみました。（僕のサイトです...）