我正在向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错误请求)
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中,我使用了list of dict;在php中,我认为它只是数组的数组。
发布于 2010-10-30 21:12:29
在这样的情况下,我发现看一下线路上发生了什么总是比试图弄清楚代码可能出了什么问题更好。
我的建议是:
BaseHTTPServer创建一个小型测试服务器,并从BaseHTTPRequestHandler派生一个类,该类不做任何事情,只是提供do_POST方法的覆盖do_POST应该只是转储它收到的头和POST主体到文件<>H19将您的代码样本指向这个小型测试服务器,然后比较它创建的文件。我猜,如果答案不是一目了然,你至少会得到一个或多个有用的线索来解决这个问题。--
发布于 2010-10-30 21:41:01
我不确定这是否会导致您的问题,但我确实看到了两者之间的区别:在python代码中,您发送两个标题行: Content-Type和Accept。而在PHP代码中,它们是一行。
发布于 2010-10-31 21:49:05
缺少参数索引- cURL POST字段需要作为查询字符串或数组发送。
以下任一项:
curl_setopt($ch, CURLOPT_POSTFIELDS, 'payload=' . urlencode($payload));或
curl_setopt($ch, CURLOPT_POSTFIELDS, array('payload' => $payload));将payload替换为接口期望保存JSON字符串的参数的名称。
如果端点API不需要参数,那么它应该可以工作-它只是不会出现在测试脚本的POST数组中。您可以使用以下命令获取POST内容的正文
$data = file_get_contents("php://input");
var_dump($data);https://stackoverflow.com/questions/4058405
复制相似问题