序章

多くのWebアプリでは、APIを使用してさまざまなサードパーティサービスに接続するのが普通です。 これらのAPIを使用すると、天気情報、スポーツスコア、映画のリスト、ツイート、検索エンジンの結果、写真などのデータにアクセスできます。 APIを使用してアプリに機能を追加することもできます。 これらの例としては、支払い、スケジュール設定、電子メール、翻訳、地図、ファイル転送などがあります。 これらのいずれかを自分で作成する場合は時間がかかりますが、APIを使用すると、APIに接続してその機能やデータにアクセスするのに数分しかかかりません。

この記事では、PythonでHTTPリクエストを送信できるPythonRequestsライブラリについて学習します。

警告:このチュートリアルの後半は、Yandex.Translateの無料のAPIキーに依存していました。 この時点で、これらはもはや自由に発行されていません。 このチュートリアルの残りの部分は、教育目的でそのまま提供されます。

また、APIを使用するとHTTPリクエストを送信し、レスポンスを受信するため、Requestsを使用するとPythonでAPIを使用できます。 ここでは、言語翻訳APIの使用方法を示し、その動作例を確認します。

前提条件

このチュートリアルを完了するには、次のものが必要です。

HTTPリクエストを理解する

HTTPリクエストは、Webの仕組みです。 Webページに移動するたびに、ブラウザはWebページのサーバーに対して複数の要求を行います。 次に、サーバーはページのレンダリングに必要なすべてのデータで応答し、ブラウザーは実際にページをレンダリングして、ページを表示できるようにします。

一般的なプロセスは次のとおりです。

  • クライアント(ブラウザやリクエストを使用するPythonスクリプトなど)は、URLにデータを送信します。
  • 次に、URLにあるサーバーがデータを読み取り、それをどう処理するかを決定し、クライアントに応答を返します。
  • 最後に、クライアントは応答のデータをどう処理するかを決定できます。

クライアントがリクエストで送信するデータの一部は、リクエストメソッドです。 一般的なリクエストメソッドには、GET、POST、PUTがあります。 GETリクエストは通常、何かを変更せずにデータを読み取るためだけのものですが、POSTおよびPUTリクエストは通常、サーバー上のデータを変更するためのものです。 たとえば、 Stripe API を使用すると、POSTリクエストを使用して新しい料金を作成できるため、ユーザーはアプリから何かを購入できます。

注:サーバー上のデータを変更しないため、この記事ではGETリクエストについて説明します。

PythonスクリプトまたはWebアプリ内からリクエストを送信する場合、開発者は、各リクエストで何を送信するか、および応答をどのように処理するかを決定できます。 それでは、最初に DigitalOcean.com にリクエストを送信し、次に言語翻訳APIを使用してそれを調べてみましょう。

ステップ1—Pythonリクエストのインストール

仮想環境をまだ作成していない場合は、最初に作成することをお勧めします。

次に、ライブラリをインストールする必要があります。 を使用してリクエストをインストールしましょう pip.

  1. pip install requests

この時点で、プロジェクトはリクエストを使用する準備ができています。

ステップ2—最初のリクエストを行う

まず、リクエストを使用してDigitalOceanサイトをリクエストしましょう。

というファイルを作成します script.py 次のコードを追加します。 この記事では、使用するコードがあまりないため、何かが変更された場合は、新しい行を追加する代わりに、既存のコードを更新するだけで済みます。

script.py
import requests

res = requests.get('https://www.digitalocean.com/')

print(res)

したがって、このコードが実行しているのは、DigitalOceanにGETリクエストを送信することだけです。 これは、ブラウザがこのページを表示するために送信したリクエストと同じタイプですが、唯一の違いは、リクエストが実際にHTMLをレンダリングできないため、代わりに生のHTMLとその他の応答情報を取得することです。

使用している .get() ここで機能しますが、Requestsでは次のような他の機能を使用できます .post().put() それらのリクエストも送信します。

あなたはそれを実行することによってそれを実行することができます script.py ファイル。

  1. python script.py

そして、これがあなたが見返りに得るものです:

Output
<Response [200]>

次に、200ステータスコードの意味を調べてみましょう。

ステップ3—ステータスコードを理解する

最初にできることは、ステータスコードを確認することです。 HTTPコードの範囲は1XXから5XXです。 おそらく見たことがある一般的なステータスコードは、200、404、および500です。

各ステータスコードの意味の概要は次のとおりです。

  • 1XX-情報
  • 2XX-成功
  • 3XX-リダイレクト
  • 4XX-クライアントエラー(エラーが発生しました)
  • 5XX-サーバーエラー(エラーが発生しました)

一般的に、独自のリクエストを実行するときに探しているのは、200年代のステータスコードです。

リクエストは、4XXおよび5XXステータスコードがエラーであることを認識します。したがって、これらのステータスコードが返された場合、リクエストからの応答オブジェクトは次のように評価されます。 False.

応答が真実かどうかを確認することで、要求が正常に応答したかどうかをテストできます。 例えば:

script.py
if res:
    print('Response OK')
else:
    print('Response Failed')

そして、これがあなたが見返りに得るものです:

Output
<Response [200]> Response OK

メッセージ "Response Failed" 400または500のステータスコードが返された場合にのみ表示されます。 URLをナンセンスに変更して、404で応答が失敗することを確認してください。

次を追加することで、ステータスコードを直接確認できます。

script.py
print(res.status_code)

これにより、ステータスコードが直接表示されるため、自分で番号を確認できます。

Output
<Response [404]> Response Failed 404

これにより、応答、スクリプトメッセージ、および応答ステータスコードが表示されます。

ステップ4—ヘッダーを理解する

応答から取得できるもう1つのことは、ヘッダーです。 応答オブジェクトのヘッダーディクショナリを使用して、それらを確認できます。

script.py
print(res.headers)

これにより、次の出力が生成されます。

Output
{'Date': 'date', 'Content-Type': 'text/html', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'Set-Cookie': '__cfduid=id; expires=date; path=/; domain=.digitalocean.com; HttpOnly; SameSite=Lax', 'Last-Modified': 'date', 'Vary': 'Accept-Encoding', 'ETag': 'etag', 'Expires': 'date', 'Cache-Control': 'max-age=time, public', 'Content-Encoding': 'gzip', 'CF-Cache-Status': 'DYNAMIC', 'cf-request-id': 'id', 'Expect-CT': 'max-age=time, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', 'Server': 'cloudflare', 'CF-RAY': 'ray'}

ヘッダーはリクエストと一緒に送信され、レスポンスで返されます。 ヘッダーは、クライアントとサーバーの両方が、応答で送受信されているデータを解釈する方法を知っているように使用されます。

返されるさまざまなヘッダーを確認できます。 多くの場合、ヘッダー情報を直接使用する必要はありませんが、必要に応じてそこにあります。

コンテンツタイプは、データの形式(HTML、JSON、PDF、テキストなど)を明らかにするため、通常は必要になる可能性があります。 ただし、コンテンツタイプは通常、リクエストによって処理されるため、返されるデータにアクセスできます。

ステップ5—応答テキストを理解する

そして最後に、あなたが見てみると res.text (これは、現在表示しているHTMLページなどのテキストデータで機能します)DigitalOceanのホームページを構築するために必要なすべてのHTMLを確認できます。 レンダリングされませんが、DigitalOceanに属しているように見えます。

script.py
print(res.text)

これにより、次の出力が生成されます。

Output
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="ie=edge"/><meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"/> [...] <title data-react-helmet="true">DigitalOcean – The developer cloud</title><meta data-react-helmet="true" name="description" content="Helping millions of developers easily build, test, manage, and scale applications of any size – faster than ever before."/> [...]

これをファイルに保存して開くと、DigitalOceanサイトに似たものが表示されます。 実際の状況では、画像、スクリプト、スタイルシートなどを読み込むために1つのWebページに対して複数のリクエストが行われるため、HTMLのみをファイルに保存すると、DigitalOceanサイトのようにはなりません。 HTMLデータを取得するために実行されたリクエストは1つだけだったため、ブラウザ。

ステップ6—TranslateAPIを使用する

それでは、もっと面白いことに移りましょう。 Yandex Translate APIを使用して、テキストを別の言語に翻訳するリクエストを実行します。

APIを使用するには、最初にサインアップする必要があります。 サインアップしたら、Translate APIに移動して、APIキーを作成します。 APIキーを取得したら、それを定数としてファイルに追加します。 これらすべてを実行できるリンクは次のとおりです。https://tech.yandex.com/translate/

script.py
API_KEY = 'your yandex api key'

APIキーが必要な理由は、YandexがAPIを使用するたびに認証できるようにするためです。 APIキーは、送信時にリクエストURLの最後に追加されるため、軽量の認証形式です。

APIを使用するために送信する必要のあるURLを知るには、Yandexドキュメントを参照してください。

そこを見ると、TranslateAPIを使用してテキストを翻訳するために必要なすべての情報が表示されます。

https://translate.yandex.net/api/v1.5/tr.json/translate
 ? key=<API key>
 & text=<text to translate>
 & lang=<translation direction>
 & [format=<text format>]
 & [options=<translation options>]
 & [callback=<name of the callback function>]

アンパサンド付きのURLが表示された場合(&)、疑問符(?)、等号(=)、URLがGETリクエスト用であることを確認できます。 これらの記号は、URLに付随するパラメーターを指定します。

通常、角かっこで囲まれたもの([])はオプションになります。 この場合、 format, options、 と callback オプションです。 と key, text、 と lang リクエストには必須です。

それでは、そのURLに送信するコードを追加しましょう。 作成した最初のリクエストを次のように置き換えることができます。

script.py
url = 'https://translate.yandex.net/api/v1.5/tr.json/translate'
res = requests.get(url)

パラメータを追加する方法は2つあります。 URLの末尾に直接追加することも、リクエストに代わって追加することもできます。 後者を実現するために、パラメーターの辞書を作成できます。 必要な3つの項目は、キー、テキスト、および言語です。 APIキーを使用して辞書を作成しましょう。 'Hello' テキストの場合、および 'en-es' langとして、これは英語からスペイン語に翻訳したいことを意味します。

他の言語コードを知る必要がある場合は、このISO639-1コードのリストを参照してください。 639-1列に注目してください。

を使用してパラメータ辞書を作成できます dict() 関数を作成し、辞書に必要なキーと値を渡します。

script.py
params = dict(key=API_KEY, text='Hello', lang='en-es')

次に、パラメータ辞書を取得して、 .get() 関数。

script.py
res = requests.get(url, params=params)

この方法でパラメータを渡すと、リクエストが先に進み、パラメータをURLに追加します。

それでは、を追加しましょう print 応答テキストのステートメントを作成し、応答で返される内容を確認します。

script.py
print(res.text)

これにより、次の出力が生成されます。

Output
{"code': 200, "lang": "en-es", "text": ["Hola"]}

3つのことがわかります。 応答自体のステータスコードとまったく同じステータスコードが表示され、指定した言語が表示され、リスト内に翻訳されたテキストが表示されます。 だからあなたは見るべきです 'Hola' 翻訳されたテキストの場合。

で再試行してください en-fr 言語コードとして、そしてあなたは見るべきです 'Bonjour' 今の応答で。

script.py
params = dict(key=API_KEY, text='Hello', lang='en-fr')

これにより、次の出力が生成されます。

Output
{"code": 200, "lang": "en-fr", "text": ["Bonjour"]}

この特定の応答のヘッダーを見てみましょう。

script.py
print(res.headers)

これにより、次の出力が生成されます。

Output
{'Server': 'nginx/1.6.2', 'Date': 'Sat, 20 Apr 2019 08:57:01 GMT', 'Content-Type': 'application/json; charset=utf-8', 'Content-Length": '46', 'Connection': 'keep-alive', 'Keep-Alive': 'timeout=120', 'X-Content-Type-Options': 'nosniff', 'Cache-Control': 'no-store'}

別のサーバーと通信しているため、ヘッダーは異なるはずですが、この場合、コンテンツタイプは application/json それ以外の text/html. これは、データをJSONとして解釈できることを意味します。

いつ application/json は応答のコンテンツタイプです。リクエストで応答を辞書とリストに変換して、データに簡単にアクセスできるようにすることができます。

データをJSONとして解析するには、 .json() 応答オブジェクトのメソッド。

印刷すると、データは同じように見えますが、形式が少し異なります。

script.py
json = res.json()
print(json)

これにより、次の出力が生成されます。

Output
{'code': 200, 'lang': 'en-fr', 'text': ['Bonjour']}

それが異なる理由は、それがあなたが得る平文ではなくなったからです res.text. 今回は辞書の印刷版です。

テキストにアクセスしたいとします。 これは辞書になっているので、 text 鍵。

script.py
print(json['text'])

これにより、次の出力が生成されます。

Output
['Bonjour']

そして今、あなたはその1つのキーのデータだけを見ることができます。 この場合、1つのアイテムのリストを見ているので、リスト内のそのテキストを直接取得したい場合は、インデックスからアクセスできます。

script.py
print(json['text'][0])

これにより、次の出力が生成されます。

Output
Bonjour

そして今、あなたが見るのは翻訳された単語だけです。

パラメータの変更を行うと、異なる結果が得られます。 翻訳するテキストを変更しましょう HelloGoodbye、ターゲット言語をスペイン語に戻し、リクエストを再送信します。

script.py
params = dict(key=API_KEY, text='Goodbye', lang='en-es')

これにより、次の出力が生成されます。

Output
Adiós

長いテキストをさまざまな言語に翻訳してみて、APIがどのような応答を返すかを確認してください。

ステップ7—TranslateAPIエラーケースの処理

最後に、エラーの場合を見ていきます。 すべてが常に機能するとは限らないため、それがいつ発生するかを知る必要があります。

1文字を削除してAPIキーを変更してみてください。 これを行うと、APIキーは無効になります。 次に、リクエストを送信してみてください。

ステータスコードを見ると、次のようになります。

script.py
print(res.status_code)

これにより、次の出力が生成されます。

Output
403

APIを使用している場合は、アプリのニーズに応じてエラーケースを処理できるように、問題がないかどうかを確認する必要があります。

結論

この記事では、PythonでHTTPリクエストを送信できるPythonRequestsライブラリについて学習しました。

これがあなたが学んだことです:

  • HTTPリクエストのしくみ
  • 応答で可能なさまざまなステータスコード
  • PythonRequestsライブラリを使用してリクエストを送信および受信する方法
  • 言語翻訳APIを使用してテキストを翻訳する方法
  • 変換する方法 application/json 辞書へのコンテンツの応答

Pythonについて詳しく知りたい場合は、Reactトピックページで演習とプログラミングプロジェクトを確認してください。