http.client使用時の注意点
http.clientを利用したget/postなどのAPI通信を記述する際に少し癖があったので
注意点について自分用の備忘録となります。
authorization エラーや
InvalidURL エラー
gai error(getaddrinfo)エラーなど解決できるかも。
注意点解説
1. "https://" 等は書かない
アクセスしたいエンドポイントが
"https://OOO.jp.~~.com/api/v2/user/XXXXX"
の場合
path = "OOO.jp.~~~.com"
conn = http.client.HTTPSConnection(path)
となる。
path内の "https://" は省略する必要がある。
また3.にて後述するがorigin以降は別途記述する必要がある。
2. httpsやhttpに応じてConnection名を変える
アクセスしたいエンドポイントが
"https://OOO.jp.~~.com/api/v2/user/XXXXX"
の場合
path = "OOO.jp.~~~.com"
#アクセスしたいエンドポイントがhttpsの場合
"https://OOO.jp.~~.com/api/v2/user/XXXXX"
conn = http.client.HTTPSConnection(path)
#アクセスしたいエンドポイントがhttpの場合
"http://OOO.jp.~~.com/api/v2/user/XXXXX"
conn = http.client.HTTPConnection(path)
となる。
conn 部分の http.client. 以降は
httpの場合 :HTTPConnction(path)
httpsの場合:HTTPSConnection(path)
とする。
3.origin部分とそれ以降で分けて記述する
originとは
"http://example.com/app1/index.html"
で言うところの
"http://example.com"
の部分。
同一ページにおけるURLの共通部分(不変の部分)くらいのイメージ。
詳しくは検索したり以下のサイトなど参照。
https://developer.mozilla.org/ja/docs/Glossary/Origin
今回
アクセスしたいエンドポイントが以下の場合
"https://OOO.jp.~~.com/api/v2/user/XXXXX"
originは
"https://OOO.jp.~~.com" であり
この部分と
"/api/v2/user/XXXXX"
以降の部分は分けて記述する必要がある。
どのように記述するかは以下に例を記載する。
# ここのpathはhttps://などを省くかつorigin部分のみを記述する
path = "OOO.jp.~~~.com"
conn = http.client.HTTPSConnection(path)
# request送信
# ここの第二引数にorigin以降のAPIエンドポイントURIを記載する。
conn.request("GET","/api/v2/user/XXXXX")
4.結果のデコードについて
データは最初
http.client.HTTPResponse型で返ってくる
以降
http.client.HTTPResponse型
→byte型
→str型
→辞書型
で変更していく。
(どのように変更してもいいが一例として記載しておく程度に留める)
import ast
#内容取得 type:http.client.HTTPResponse型
res = conn.getresponse()
#内容のbyte型への変換 type:byte型
data = res.read()
#内容のbite型→文字列型へのデコード type:str型
res = data.decode("utf-8")
#文字列型→辞書型への変換 type:dictionary型
dict_ = ast.literal_eval(res)
完成版のコード
例)https://OOO.jp.~~.com/api/v2/user/XXXXX
といったエンドポイントにget接続する場合
import ast
import http.client
# ここのpathはhttps://などを省くまたorigin部分のみを記載
path = "OOO.jp.~~~.com"
# http or httpsによってclient以降の記述を変える。
conn = http.client.HTTPSConnection(path)
# header設定 必要に応じて
access_token = "OOO"
headers = { 'authorization': access_token }
# request送信
# ここの第二引数にorigin以降のAPIエンドポイントURIを記載する。
conn.request("GET","/api/v2/user/XXXXX" , headers=headers)
# 内容取得 type:http.client.HTTPResponse型
res = conn.getresponse()
# 内容のbite型への変換 type:byte型
data = res.read()
# 内容のbyte型→文字列型へのデコード type:str型
res = data.decode("utf-8")
# 文字列型→辞書型への変換 type:dictionary型
dict_ = ast.literal_eval(res)
print(dict_)