問題
TrelloのAPI経由でタスクなどを取得してDiscordなどに表示していたが、2020年8月後半からタスクなどが表示されなくなった。
原因
Discordにエラーなどは表示されず。(そういう設定もしていないけど)
「APIが原因か?」と考え、APIを含めたURLで叩いてみたら問題なく取得できている。
それなら、実行ファイル(PHP
)の問題かな?
ターミナルで以下のコマンドを叩いてみる。
$ php (実行ファイル名).php
すると、以下のエラーが確認できた。
PHP Warning: file_get_contents(trelloのAPIが含まれたURL): failed to open stream: HTTP request failed! HTTP/1.1 426 Upgrade Required in (実行ファイル).php on line 15
HTTP
リクエストのエラーなのはわかったけど、426
って何? 見たことないんですけど。
調べてみた所、今のプロトコルじゃリクエストを拒否するとの事らしい。
426 Upgrade Required - HTTP | MDN
**HTTP/1.1 426 Upgrade Required in (実行ファイル).php on line 15
**って言われてるし、file_get_contents()
をHTTP/1.1
で実行できるようにすれば良いのかな?
解決策
stream_context_create()
で作成したHTTPヘッダ情報をfile_get_contents()
に渡す。
自分の予想で合っていたみたい。
**stream_context_create()
**でどんな形式でHTTP
リクエストを実行するかを指定できるので、この関数を利用してHTTP/1.1
で実行できるよう宣言する。
**file_get_contents
**の第三引数でstream_context_create()
で作成したのを入れられるので、宣言したのを記述する。
以上をまとめると、実行ファイルは以下のような形になる。
//HTTPヘッダ情報
$options = [
'http' => [
'method' => 'GET',
'protocol_version' => 1.1,
'header' => "Connection: close\r\n"
]
];
$context = stream_context_create($options);
$trello_url = "trelloのAPIが含まれたURL";
$trello_data = file_get_contents($trello_url,FALSE,$context);
Connection: close
はリクエストが完了した後に、接続を切断してくれるよう宣言している。
修正後、挙動を確認してみた所、無事解決した。