我正在向网址发送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中使用double数组是因为服务器需要这种格式的JSON字符串(POST有效负载)
{
"version": "1.0",
"data":
[{"param1":name, "age":35},{"param1":name,"age":60}]
}
在python中,我使用的是dict列表;在php中我认为它只是数组的数组。
答案 0 :(得分:1)
在这样的情况下,我发现通过查看线路上的内容总是更好,而不是试图弄清楚代码可能出错的地方。
我的建议:
使用python BaseHTTPServer
创建一个小测试服务器
从中派生出一个类
BaseHTTPRequestHandler
但没有
做任何事情,但提供覆盖
do_POST
方法
你的do_POST
应该转储
它收到的标题和POST正文
档案
将代码示例指向此处 小测试服务器,然后差异 它创建的文件。我正在猜测 如果答案不是立即的话 很明显,你至少会得到 一个或多个有用的线索来st脚 这个问题出来了。
答案 1 :(得分:1)
我不确定它是否会导致您的问题,但我确实看到了两者之间的区别: 在python代码中,您发送两个标题行:Content-Type和Accept。在PHP代码中,它们只是一行。
答案 2 :(得分:1)
您缺少参数索引 - cURL POST字段需要作为查询字符串或数组发送。
或者:
curl_setopt($ch, CURLOPT_POSTFIELDS, 'payload=' . urlencode($payload));
或者
curl_setopt($ch, CURLOPT_POSTFIELDS, array('payload' => $payload));
将payload
替换为API所需的参数名称,以保存JSON字符串。
如果端点API不期望参数,那么它应该工作 - 它不会出现在测试脚本的POST数组中。您可以使用
获取POST内容的主体$data = file_get_contents("php://input");
var_dump($data);