筆者は、BING SEARCH APIをPythonで使用しています。
プログラムを書いてみたけど、APIが返してくる“HTTP Error 400: Bad Request”に悩まされたことはありませんか?
分ってしまえば「あー、何だ」といったことなのですが、気づかないと時間ばかり浪費してしまいます。
APIにアクセスすため、urllib2を使います。
以下がエラーが出るサンプルコードです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | import urllib2 #途中省略 reqdata[ 'Sources' ] = 'web' reqdata[ 'Query' ] = 'ほげほげ' params = urllib.urlencode(reqdata) #エンコーディング query_url = baseurl + '?' + params #BASIC認証関係の処理が入るけど省略 f = urllib2.urlopen(query_url) #ここで“HTTP Error 400: Bad Request” |
原因
BING SEARCH APIに送信したリクエストに問題があるため、サーバー側がリクエストを処理することができない場合に発生します。
さきほどのソースの場合は、APIに渡すパラメータをシングルクォーテーション(‘)で囲んでいないことが原因です。
BING SEARCH APIでは、シングルクォーテーション(‘)で囲まれていないとエラーになりまs。
プログラム上ではシングルクォーテーション(‘)で囲まれているように見えるので、「囲んだつもり」になってしまいますので要注意です。
解決方法
パラメータの外側をさらに、ダブルクォーテーションで囲んでやれば解決です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | import urllib2 #途中省略 reqdata[ 'Sources' ] = "'web'" #←さらにダブルクォーテーションで囲みます reqdata[ 'Query' ] = "'ほげほげ'" #←さらにダブルクォーテーションで囲みます params = urllib.urlencode(reqdata) #エンコーディング query_url = baseurl + '?' + params #BASIC認証関係の処理が入るけど省略 f = urllib2.urlopen(query_url) |