04/25 sun たなか
APIとは
ざっくりした理解ではソフトウエアをその外側から情報を引き出すための窓口。
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)"
って入れるもんな。オプション難解すぎるだろ。
基本これでいいけど、もっといい例をどっかで使った覚えがある。
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'
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による認証も加味してありかつシンプル
リンク先にもあるが、MS Learnはいいぞ。
GoでAPIサーバを作るのはここから始めよう
Java
他のメンバーが困っていたので一緒に解決した。
リンク先の "普通にJavaでHTMLやら読み込むときとまったく同じですね"が核心をついていて、
基本的にHTTP通信を行って生成されるhtmlないしjsonのようなハイパーテキストをとってきてるといえばそれはそう。
たとえばこんな感じで記述する
code:old.java
import java.io.*;
import java.net.URL;
class GithubApi {
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年以上前)から使われてるやり方らしく、非同期通信なんかの拡張もサポートしたい場合は
みたいな書き方をする必要がある
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()
.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として指定するといいらしい。
Win版だとどうなんだろう
各種ライブラリを追加で.jarの形で入れていくような記事があったけど、今日日HTTP通信+web sokectくらい基本的に標準のライブラリとして組み込んであるのでは?
Web開発初心者のリクルート課題としてWebAPIのコールが含まれることがあるが、
検索方法としては、{言語名} Twitter APIみたいな感じで具体的な公開APIを叩くやり方を先駆者から学ぶといい。
返ってくるJSONをどうパースするか、みたいな文字列処理周りのイメージもつきやすい。
ちなみにこれによれば、Apache HTTP Clientを使うほうがいいぞとある。
httpリクエストの戻り方、みたいなのはこれを参照するといいかも