不惑にしてまだ何者でもない者のブログ

Arduino関連、Raspberry Pi関連、プログラミング学習

paizaラーニング『Web技術入門編03 :WebAPIを使ってみよう (全10回) 』を受講してみた

2020-10-11 22:48:35 | paiza
本講座最後のレッスン『Web技術入門編03 :WebAPIを使ってみよう (全10回) 』を受講する。

APIに関してもよくわからないのに、WebAPIとは何なんだろう?

01:Web APIについて知ろう

  • API:Application Programming Interface
    自分の機能を他のプログラムから呼び出してもらうための命令や関数
  • Web API
    HTTPを介して呼び出すAPI
  • WebAPIを作る標準的な手法
    • REST:Representational State Transfer
      - HTTPの特徴を活かしたWebサービスの設計スタイル
      - いくつかの制約に合わせてコンポーネントを分離
      - システムがシンプルになり、スケーラビリティを確保
    • JSON:JavaScript Object Notation
      - WebAPIのデータ交換フォーマットとして広く採用
      - JavaScriptの記法をベースにしたデータ記述フォーマット
      - 扱いやすいシンプルな記法
      - 多くのツールやプログラミング言語で利用

02:RESTを理解しよう

  • RESTの設計原則
    - ステートレスなクライアント/サーバモデル
    - すべてのリソースに適用できる、よく定義された操作のセット
    - リソースを指定する統一的な方式
    - Webページが現在の状態を表し、リンクで次の選択肢を示す
  • RESTのメソッド
    - GET 記事を取得する
    - POST 記事を新規投稿する
    - PUT 記事を更新する
    - DELETE 記事を削除する
    • ただし、RESTでは、GETとPOSTの実装しかないため、PUTとDELETEはPOSTで代用。

03:curlコマンドで、Web APIを呼び出そう

  • curl uri:WebサーバーからHTTPでWebページの情報を取得する。
~$ curl https://5f8311c249545c00b8a4c1dc.paiza-user-learning.cloud/~ubuntu/index.php

Hello World

~$

~$ curl https://5f8311c249545c00b8a4c1dc.paiza-user-learning.cloud/~ubuntu/index.php -i
  • ぱいじょキャラのいいね機能API
# 全部取得
curl https://paiza.jp/paijo_charactors

# 名前を指定して取得
curl https://paiza.jp/paijo_charactors?name=kirishima

# 存在しない名前の場合は、404
curl https://paiza.jp/paijo_charactors?name=kiri
curl -i https://paiza.jp/paijo_charactors?name=kiri

# いいね
curl https://paiza.jp/paijo_charactors/like -X POST -d " name=rokumura"

# いいね:存在しない名前の場合は、404
curl https://paiza.jp/paijo_charactors/like -X POST -d " name=neko"
curl https://paiza.jp/paijo_charactors/like -i -X POST -d " name=neko"
  • jq:jsonデータを整形して出力

04:JSONを理解しよう

  • JSONフォーマットの基本
[
 {
  "id": 2,
  "name": "rokumura",
  "favorite_language": "Python",
  "hair_color": "blonde",
  "blood_type": "O",
  "likes": 2096
 },
 {
  "id": 1,
  "name": "kirishima",
  "favorite_language": "Ruby",
  "hair_color": "brown",
  "blood_type": "B",
  "likes": 7457
 },
]
  • jpコマンドで要素を絞り込む
$ curl https://paiza.jp/paijo_charactors | jq .[0]
  • 特定の値を取り出す
$ curl https://paiza.jp/paijo_charactors | jq .[1].name
  • すべての要素の特定の値を取り出す
$ curl https://paiza.jp/paijo_charactors | jq .[].name
  • ダブルクォーテーションなしで出力
$ curl https://paiza.jp/paijo_charactors | jq .[].name -r

05:Web APIでデータを読み込もう - Ruby編

  • RubyでWebデータを取得
require 'open-uri'
require 'json'

uri = 'https://paiza.jp/paijo_charactors'
response = URI.open(uri)
# puts response.read

jsonObject = JSON.load(response)
# puts jsonObject

jsonObject.each do | item |
 puts "#{item['name']}, #{item['likes']}"
end
演習課題では、上記のようにURI.openにしないと通らないっぽい。

06:Web APIでデータを書き込もう - Ruby編

  • open-uri:httpに簡単にアクセスするためのモジュール
    • GETメソッドに使用する
    • uriは文字列で指定する
  • uri:URIを扱うモジュール
  • net/http:HTTPを扱うモジュール
    • GETとPOSTに使用する
    • URIは、uriモジュールで変換する
  • JSONデータを読み込んで変換する
require 'uri'
require 'net/http'
require 'json'

getUri = URI.parse('https://paiza.jp/paijo_charactors')
response = Net::HTTP.get(getUri)
# puts response

jsonObject = JSON.load(response)
jsonObject.each do | item |
 puts "#{item['name']}, #{item['likes']}"
end
  • いいねを投票する
postUri = URI.parse('https://paiza.jp/paijo_charactors/like')
postResponse = Net::HTTP.post_form(postUri, {'name' => 'kirishima'})
puts postResponse.body

07:Web APIでデータを読み込もう - Python編

  • PythonでWebデータを取得
# coding: utf-8
import requests

uri = 'https://paiza.jp/paijo_charactors'
response = requests.get(uri)
# print(response.json())

for item in response.json():
print(item)

08:Web APIでデータを書き込もう - Python編

  • いいねを投票する
# coding: utf-8
import requests

uri = 'https://paiza.jp/paijo_charactors'
response = requests.get(uri)

for item in response.json():
 print(item['name'], item['likes'])

postUri = uri + '/like'
result = requests.post(postUri, {'name':'midorikawa'})
print(result.json())

09:Web APIでデータを読み込もう - PHP編

  • PHPでWebデータを取得
 $uri = 'https://paiza.jp/paijo_charactors';
 $response = file_get_contents($uri);
 // echo $response;

 $jsonObject = json_decode($response, true);
 // print_r($jsonObject);

 foreach($jsonObject as $item) {
  echo implode(',', $item) . PHP_EOL;
 }

10:Web APIでデータを書き込もう - PHP編

  • いいねを投票する
$uri = 'https://paiza.jp/paijo_charactors';
$response = file_get_contents($uri);
// echo $response;

$jsonObject = json_decode($response, true);
// print_r($jsonObject);

foreach($jsonObject as $item) {
// echo implode(',', $item) . PHP_EOL;
echo $item['name'] . ':' . $item['likes'] . PHP_EOL;
}

$postUri = $uri . '/like';
$jsonObject = http_build_query(['name' => 'rokumura']);
$context = stream_context_create (
[
'http' =>
[
'method' => 'POST',
'header' => 'Content-Type: application/x-www-form-urlencoded',
'content' => $jsonObject
]
]
);

$result = file_get_contents ($postUri, false, $context);
print_r($result);
↑インデントめんどいのコピペしたまま。自動でインデント付けるいい方法ないのかな?

感想

演習の中でしれっといいねを押させようとしていることにイラッときた。
何はともあれ、Web技術入門編もすべて完了して達成率も100%になった。
次は何を受講しようか。