オープンデータとプログラミング

Bingの検索APIを使用する(2) “HTTP Error 400: Bad Request”の原因と解決方法は!?

筆者は、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)

Comments are closed.