2016-08-09 169 views
0

過濾輸出GET請求發送有效載荷,我可以發送JSON的API,如:在蟒蛇

curl -X GET https://api.mysite.com/user \ 
    -H "Authorization: XXXXX" \ 
    -H "Content-Type: application/json" 
    -d '{ 
    "q": { 
     "name": { 
      "eq": "0aslam0" 
     }   
    } 
    }' 

上述工作就好了。我試圖通過使用requests library.I Python代碼發送相同的嘗試下面的代碼:

r = requests.get(url, headers=my_headers, params=payload) 

其中

url = "https://api.mysite.com/user" 
my_headers = { 
    'Authorization': 'XXXXX', 
    'Content-Type': 'application/json', 
    'Accept': 'application/json', 
} 
data = { 
    "q": { 
     "name": { 
      "eq": "0aslam0" 
     } 
    } 
} 
payload = json.dumps(data) 

r.text含有正常GET的輸出不應用過濾器。我登錄了請求,看到我正在重定向301。我不明白我的錯誤。

編輯1

我改變了代碼:

r = requests.get(url, headers=my_headers, json=payload) 

@Martijn是正確的。使用params是錯誤的。但上述也沒有成功。我還添加了一個標題'User-Agent': 'curl/7.40.0',以查看這是否可行。那裏也沒有運氣。

編輯2

API文檔說,濾波可以通過另一種方法來完成。更改網址爲:

GET /user?q%5Bname%5D%5Beq%5D=0aslam0 HTTP/1.1 

它是HTML編碼的。所以我嘗試過,把我的網址格式化成這樣的格式,並避免發送有效載荷,如:

r = requests.get(url, headers=my_headers) 

它的工作原理!所以至少現在我有解決我的問題。但是關於如何發送GET請求的有效載荷(上面討論的方法)的問題仍然存在。

+0

如何授權標題形成?根據請求主體是否包含任何簽名? –

+0

授權標頭是爲API的任何開發者生成的令牌。不,沒有任何東西像簽名依賴於請求主體。 – 0aslam0

+0

然後我幾乎沒有想法;下面的答案會產生一個接近你的'curl'命令的請求(這是*很奇怪,因爲它使用'GET'而不是'POST')。 –

回答

0

當您使用-d時,數據作爲請求發送正文params發送一個URL查詢字符串,所以這是使用錯誤的參數。

請注意,使用GET方法沿請求正文進行打包在技術上違反了HTTP RFC。

你必須發送請求的data參數設置來替代,或者在你的字典傳遞給json關鍵字參數和requests將編碼,併爲您的權利Content-Type頭:

my_headers = { 
    'Authorization': 'XXXXX', 
} 
data = { 
    "q": { 
     "name": { 
      "eq": "0aslam0" 
     } 
    } 
} 
r = requests.get(url, headers=my_headers, json=data) 
+0

我試過了。我仍然得到未經過濾的輸出。 – 0aslam0

+0

@ 0aslam0:生成與您的'curl'命令生成的HTTP請求相同的HTTP請求。唯一的區別是'User-Agent:curl/7.43.0'的頭文件,真的。 –