2017-10-17 197 views
0

PHP捲曲蟒蛇要求POST請求嵌套JSON

試圖讓POST請求的API訂購產品。看來,我無法弄清楚如何實際發送一個json-payload和post-request,以便API正確接收它。

該服務只提供了一個PHP的例子:

PHP-例如:

$params = array(); 
$params['access_token']    = '123abc'; 
$params['product_total']   = 2; 
$params['product_list'] = array(
    array(
     'product_id' => 111 
    ), 
    array(
     'product_id' => 222 
    ), 
); 

這是到目前爲止我Python代碼:

import requests 

payload = { 
      "access_token": "123abc", 
      "product_total": 2, 
      "product_list":[ 
       { 
        "product_id": 111, 
        ... 
       }, 
       { 
        "product_id": 222, 
        ... 
       }] 
      } 

r = requests.post(url, data=payload, verify=False) 
r.text 
> u'{"code":123,"msg":"product_id is empty"}' 

所以什麼是錯的我發送方式product_list

我也試過:

import json 
r = requests.post(url, data=json.dumps(payload), verify=False) 
> u'{"code":456,"msg":"access_token is empty"}' 

r = requests.post(url, json=json.dumps(payload), verify=False) 
> u'{"code":456,"msg":"access_token is empty"}' 

但比它無法讀取access_token了。

我使用的是python 2.7.9requests 2.18.4

更新: 也沒有......

r = requests.post(url, json=payloal, verify=False) 
> u'{"code":456,"msg":"access_token is empty"}' 

更新2:

我在php-例如,我從API文檔有更深層次的看,我發現這一點:

curl_setopt($this->__ch, CURLOPT_URL, $apiUrl); 
curl_setopt($this->__ch, CURLOPT_HEADER, 0); 
curl_setopt($this->__ch, CURLOPT_USERAGENT, $_SERVER ['HTTP_USER_AGENT']); 
curl_setopt($this->__ch, CURLOPT_FOLLOWLOCATION, 1); 
curl_setopt($this->__ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($this->__ch, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($this->__ch, CURLOPT_POST, 1); 
curl_setopt($this->__ch, CURLOPT_POSTFIELDS, http_build_query($this->__params)); 

也許有人可以發現一些東西在這一行,我是失蹤。

更新3:

我可以運行PHP的,例如沒有問題,並創造一個秩序的方式。但仍然不能用python來完成。

+1

您是否嘗試過使用'json'參數而不是'data'?像'requests.post(url,json = payload,verify = False)' – masterfloda

+0

@masterfloda,試過你的建議 - 仍然失敗 – RandomDude

+0

把product_id值放在列表中怎麼辦?來自請求網站: payload = {'key1':'value1','key2':['value2','value3']} – SuperStew

回答

1

我找到了解決辦法:

payload = { 
      "access_token": "123abc", 
      "product_total": 2, 
      "product_list[0][product_id]": 111, 
      "product_list[1][product_id]": 222, 
      } 

r = requests.post(url, data=payload, verify=False) 

我如何解決它:

我重新設計通過打開一個本地端口併發送工作的php請求到這個端口以查看它的有效載荷,來編輯python函數應該具有的最終發佈請求。

(mac terminal) 
user$ nc -l localhost 11111 # to open port 
POST/HTTP/1.1 
Host: localhost:11111 
Accept: */* 
Content-Length: 115 
Content-Type: application/x-www-form-urlencoded 

access_token=123abc&product_total=2&product_list%5B0%5D%5Bproduct_id%5D=111&product_list%5B1%5D%5Bproduct_id%5D=22 

只要有解碼有效負載:

from urllib import parse 
parse.unquote("access_token=123abc&product_total=2&product_list%5B0%5D%5Bproduct_id%5D=111&product_list%5B1%5D%5Bproduct_id%5D=22") 
'access_token=123abc&product_total=2&product_list[0][product_id]=111&product_list[1][product_id]=22' 

現在淨荷的結構清晰可見,只需要複製它的蟒蛇POST請求。

這是有效負載如何找我最初的蟒蛇POST請求:

'access_token=123abc&product_total=2&product_list=product_id&product_list=product_id' 

你可以清楚地看到,爲什麼它沒有工作...

如果有人有一個解釋爲什麼使用json-payload的post請求不起作用 - 我仍然對此非常感興趣。目前爲止我只能提出一個想法,即API不支持json-payload?

0

從以前類似問題的經驗,你應該嘗試(當然,實際上,http://stardict.sourceforge.net/Dictionaries.php下載你的Python列表)張貼在product_list到同一JSON的字符串表示之前,您JSON轉換:

import requests 
import json 

payload = { 
      "access_token": "123abc", 
      "product_total": 2, 
      "product_list": json.dumps([ 
       { 
        "product_id": 111, 
        ... 
       }, 
       { 
        "product_id": 222, 
        ... 
       }]) 
      } 

r = requests.post(url, data=payload, verify=False) 
r.text 
+0

仍然是相同的響應:'> u'{「code」:123,「msg」:「product_id is empty」}'' – RandomDude

+0

你有一個HTTP跟蹤一個工作要求,看看有什麼預期?或者API的文檔? – Guillaume

+0

我是唯一一個在banggood API鏈接上超時的人? – Guillaume