【发布时间】:2010-10-30 11:07:28
【问题描述】:
我正在向 URL 发送 POST 请求。它在 python 中可以正常工作,但在 php-curl 中,我总是收到一个错误的请求错误(即我的 POST 数据与服务器预期的不一样)
Python 代码:(正常工作。200 OK)
import httplib, urllib, json
def SendRequest(param1):
url = "api.xyz.com"
body = {"version": "1.0", "data":[{"param1":param1, "age":35}]}
jsonBody = json.dumps(body)
headers = {"Content-type": "application/json",
"Accept": "application/json; charset=utf8"}
conn = httplib.HTTPConnection(url)
conn.request("POST", "/api/?client_id=xx-xx-xx", jsonBody, headers)
response = conn.getresponse()
php-cURL 代码(不起作用。406 Bad request error)
function sendCurlRequest($param1)
{
$payload = preparePayload($param1);
$url = "http://api.xyz.com/api/?client_id=xx-xx-xx";
$jsonResponse = executePOSTRequest($url, $payload);
$response = json_decode($jsonResponse);
}
function preparePayload($param1)
{
$payload = array("version" = "1.0",
"data" => array(array("param1" => $param1,
"age" => 35
)
),
);
$jsonPayload = json_encode($payload);
return $jsonPayload;
}
function executePOSTRequest($url, $payload)
{
$newlines = array("\r", "\n", " ");
$url = str_replace($newlines, '', $url);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt ($ch, CURLOPT_HTTPHEADERS,array('Content-Type:application/json; Accept: application/json; charset=utf8'));
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($ch);
}
我知道我在使用 cURL 时存在一些错误。请提出建议。
更新:在 php 中使用双精度数组是因为服务器需要这种格式的 JSON 字符串(POST 有效负载)
{
"version": "1.0",
"data":
[{"param1":name, "age":35},{"param1":name,"age":60}]
}
在 python 中,我使用的是 dict 列表;在 php 中我认为它只是数组的数组。
【问题讨论】:
-
我很确定您的问题是原始 Python 代码发送的是纯 JSON 正文,而 PHP 版本将各种值作为 POST 字段发布。我不知道如何发送纯 JSON 正文,但我确信答案就在 SO
-
Pekka,感谢您的评论,但我认为在这两种情况下,我都会发送一个 JSON 字符串作为 POST 数据。你的意思是在 php 中,我的 JSON 字符串被分成几块,每个字段都作为表单字段发送?事实并非如此。