将python请求转换为PHP-cURL等价物

时间:2010-10-30 11:07:29

标签: php python curl

我正在向网址发送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中我认为它只是数组的数组。

3 个答案:

答案 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);