04/25 sun たなか
APIとは
ざっくりした理解ではソフトウエアをその外側から情報を引き出すための窓口。
ABIに沿って呼び出されるものは全てAPIと言ってもよさそう - APIとかABIとかシステムコールとか
C++のライブラリやJavaのAPIがまさにそれ Weikipedia これに関してはサブルーチン、データ構造、オブジェクトクラスの引き渡しも考えてある。
Web開発における文脈ではHTTP/1.0 ~ 1.1規格において、Webサーバーからクライアントが任意の情報を引き出すために使われる。
youtubueなんかの埋め込みタグに含まれるエンドポイントもAPIとして扱われてドキュメントも存在する
cURLの仕様
Web APIのエンドポイントの設定次第ではコマンドラインからはcurlで叩くことが容易。
よくある疎通確認としての200 OKみたいなステータスコードも得られる Qiita
レスポンスヘッダとボディ
curl -OL http://hogemoge.com/example.zip でファイルダウンロードもできる。
Homebrew入れる時も、
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
って入れるもんな。オプション難解すぎるだろ。
curl option 覚え書き - Qiita https://qiita.com/takayukioda/items/edf371b3566bea64d046
基本これでいいけど、もっといい例をどっかで使った覚えがある。
libcurlなんかもそうだが、SCP、(S)FTP、TELNETみたいなファイル転送周りから、IMAP、POP3、SMTPみたいなメール関係のプロトコルをサポートしてるのはやばい。 (xmailとかもこれが組み込んであるってことだってばよ?)
似たような機能をwgetでも使うことができる。
curlとWgetの比較 | POSTD https://postd.cc/curl-vs-wget/ (CentとかRHEL系のやつだと入ってないんだっけ...ここらへんはセッティングにあたり似たような使い方を期待されるaptとかyumみたいなパッケージマネージャについての混乱と似たものを覚える。)
再帰的にwebページ取得したいとかだとwget便利かも(スクリプト言語でやれ).
WebAPIについて
Webhookとは
アプリケーションの更新情報を他のところに飛ばせる仕組み
例としてはgithubへのpushが行われたらslackに通知する、とか
CDNとは
htmlとかでいろんなものを実行できる(これはajaxとかと比較するといいのか)
最近はWASMのおかげでブラウザで処理が完結することが増えてきた。
RESTful API
簡単な例だと、n箇所からjsonをとってきて統合してね〜という例でHTTP通信を行ったりだとか、逆にORMを介したデータベースの操作の結果をクライアントに渡したりする。
公開APIの例
気象庁とかが最近話題になった
HTTP/1.1
モダンなWeb開発におけるAPI
Railsにはバックエンドとして活用するAPIモードがある
(g)RPCについて
HTTP/2.0規格におけるサーバ間の双方向通信を可能にした技術
WebAPIの叩き方いろいろ
Ruby
Rubyの場合Enumerable クラスのオブジェクトとして扱えるのがめちゃくちゃ便利なように思う。
code:sample.rb
require 'net/http'
require 'uri'
require 'json'
uri=URI.parse("https://hoge.com/hoge.json")
request = Net::HTTP::Get.new(uri.request_uri)
response = Net::HTTP.start(uri.host, uri.port, :use_ssl => uri.scheme == 'https') do |http|
http.request(request)
end
p JSON.parse(response.body)
Go
Call側
Authによる認証も加味してありかつシンプル
Go の net/http を使って Web API にリクエストを行う:CData API Server - CData Software Blog https://www.cdatablog.jp/entry/golanghttpapi
リンク先にもあるが、MS Learnはいいぞ。
GoでAPIサーバを作るのはここから始めよう
Goで超簡単API - Qiita https://qiita.com/k-penguin-sato/items/8088b69304ee7e8f70be
Java
他のメンバーが困っていたので一緒に解決した。
JavaでAPIが叩きたい - "Simple" is "Best" http://bigbuddha.hatenablog.jp/entry/JAVA_GET_API
リンク先の "普通にJavaでHTMLやら読み込むときとまったく同じですね"が核心をついていて、
基本的にHTTP通信を行って生成されるhtmlないしjsonのようなハイパーテキストをとってきてるといえばそれはそう。
classとしてはHttpURLConnectionを使う。Document -> https://docs.oracle.com/javase/jp/8/docs/api/java/net/HttpURLConnection.html
openJDK入れてない場合(mac):https://qiita.com/suke_masa/items/f9af0fb84ad9447ae961
いずれにしてもeclipse使うならhttps://adoptopenjdk.net/ で
たとえばこんな感じで記述する
code:old.java
import java.io.*;
import java.net.URL;
class GithubApi {
private static final String API_URL = "https://api.github.com/users/alt9800/gists"; //叩くAPI
private static URL url = null;
private static BufferedReader br = null;
private static InputStreamReader isr = null;
public static void main ( String[] args ) {
try {
System.out.println( conectGetJson() );
} catch ( Exception e ) {
e.printStackTrace();
}
}
/* 実際にAPIを叩いて得たJSONを文字列として返す
適当に組んでいるのでエラーは投げてます
当然のことながら実際に実装する際は各自で適切な処理を*/
public static String conectGetJson() throws Exception {
url = new URL( API_URL );
String readLine = "";
String writeContent = "";
/* ここから読み込むための定型文 */
isr = new InputStreamReader( url.openStream() );
br = new BufferedReader( isr );
while ( ( readLine = br.readLine() ) != null ) writeContent = writeContent + readLine;//ここで読み込んだ内容を変数に保存している
return writeContent;
}
}
ただし、これは割と古い(20年以上前)から使われてるやり方らしく、非同期通信なんかの拡張もサポートしたい場合は
イマドキのJava徹底入門(10) HTTP接続を劇的に改善したHTTPクライアントAPIとは?(その1) | TECH+ https://news.mynavi.jp/article/imajava-10/
みたいな書き方をする必要がある
code:new.java
import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
class HttpGetSample {
public static void main(String[] args) {
// デフォルト設定でHttpClientインスタンスを作成
HttpClient client = HttpClient.newHttpClient();
// ビルダーを使用してHttpRequestインスタンスを作成
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://news.mynavi.jp/freeword?q=java"))
.build();
try {
// リクエストを送信
HttpResponse<String> response = client.send(request,
HttpResponse.BodyHandlers.ofString());
// レスポンスボディを出力
System.out.println(response.body());
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
}
例えば私のgistをとってきたい場合
https://api.github.com/users/alt9800/gists
をURLとして指定するといいらしい。
豆知識として、Wandboxから叩こうとしてもエラーがでる https://wandbox.org/
Win版だとどうなんだろう
各種ライブラリを追加で.jarの形で入れていくような記事があったけど、今日日HTTP通信+web sokectくらい基本的に標準のライブラリとして組み込んであるのでは?
Web開発初心者のリクルート課題としてWebAPIのコールが含まれることがあるが、
検索方法としては、{言語名} Twitter APIみたいな感じで具体的な公開APIを叩くやり方を先駆者から学ぶといい。
返ってくるJSONをどうパースするか、みたいな文字列処理周りのイメージもつきやすい。
Microsoft Azureのリクエストの作り方のページとかめちゃくちゃ丁寧なドキュメントで、
ちなみにこれによれば、Apache HTTP Clientを使うほうがいいぞとある。
(全然関係ないけどGoのサンプルは上のページにはなかったが、JSやC#などと同じくREST APIのエンドポイントを叩くリクエストを作成するまでもなくライブラリとしても提供してくれていたりする)
標準のjava.net.*だと面倒である とのことで、これはjava以外の言語でも似たような最適化が別のライブラリによってデファクトになってたりする例がありそうだなと思った。
Java HTTP通信のサンプル(HttpClient) ITSakura もシンプルなコンパイルといえそう。POSTとGETの違いについても触れてあったりして、他のサイトではPUTの解説をしてるところもあったかな...
/help-jp/コードブロック
/help-jp/見出し
httpリクエストの戻り方、みたいなのはこれを参照するといいかも
https://twitter.com/manekinekko/status/1281704000572858375?s=20