Python調用RESTful API時踩到的各類坑

開篇首先推薦一款REST接口調試的利器,Chrome的擴展程序Advanced REST client,功能十分齊全!使用它來模擬訪問接口能夠獲取到詳盡的信息,藉助它排查接口是否可用。 python

問題1:curl訪問API成功,可是使用python的urllib2模塊訪問卻返回400。
接口規則以下:
POST /v2.0/tokens HTTP/1.0
Host: 192.168.85.183:35357
Content-Type: application/json
Accept: application/json
{
    "auth":{
        "passwordCredentials":{
            "username":"alan",
            "password":"admin"
        },
        "tenantName":"swifttenant1"
    }
} shell

cURL模擬訪問實現以下:
json

curl -s -d '{"auth":{"passwordCredentials":{"username":"alan","password":"admin"},"tenantName":"swifttenant1"}}' -H "Content-type: application/json" http://192.168.85.183:35357/v2.0/tokens | python -mjson.tool
後臺日誌:
2013-09-03 05:34:20.133 23199 INFO access [-] 192.168.85.183 - - [03/Sep/2013:12:34:20 +0000] "POST http://192.168.85.183:35357/v2.0/tokens HTTP/1.0" 200 2711

python使用urllib2模塊:
#!/usr/bin/python
import urllib
import urllib2

def curl_keystone_failed():
    url = 'http://192.168.85.183:35357/v2.0/tokens'
    values = {"auth":{"passwordCredentials":{"username":"alan","password":"admin"},"tenantName":"swifttenant1"}}
    # 這裏千萬不要仿照網上的方法進行加密,由於它自己就沒有加密的一個過程!否則仍是會返回400的!
    # params = urllib.urlencode(values)
    params = str(values)
    headers = {"Content-type":"application/json","Accept": "application/json"}
    req = urllib2.Request(url, params, headers)
    response = urllib2.urlopen(req)
    print response.read()

if __name__ == "__main__":
    curl_keystone_failed()
後臺日誌:
2013-09-03 05:43:11.928 23199 INFO access [-] 192.168.85.185 - - [03/Sep/2013:12:43:11 +0000] "POST http://192.168.85.183:35357/v2.0/tokens HTTP/1.0" 400 244


隨後使用httplib重寫方法,查看返回的報錯信息可發現,它沒有獲取到一個有效json格式的內容,原來python傳輸的時候是嚴格斷定內容的type的。使用json來dumps一下能夠解決問題!
swift

def curl_keystone():
    url = 'http://192.168.85.183:35357/v2.0/tokens'
    values = {"auth":{"passwordCredentials":{"username":"alan","password":"admin"},"tenantName":"swifttenant1"}}
    params = json.dumps(values)
    headers = {"Content-type":"application/json","Accept": "application/json"}
    req = urllib2.Request(url, params, headers)
    response = urllib2.urlopen(req)
    print response.read()

後臺日誌: 
2013-09-03 05:50:52.884 23199 INFO access [-] 192.168.85.185 - - [03/Sep/2013:12:50:52 +0000] "POST http://192.168.85.183:35357/v2.0/tokens HTTP/1.0" 200 2711  app

相關文章
相關標籤/搜索