首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将python请求转换为PHP-cURL等效项

将python请求转换为PHP-cURL等效项
EN

Stack Overflow用户
提问于 2010-10-30 19:07:29
回答 3查看 3K关注 0票数 0

我正在向URL发送POST请求。它在python中工作正常,但在php-curl中,我总是收到一个错误的请求错误(即我的POST数据不是服务器所期望的)

Python代码:(工作正常。200 OK)

代码语言:javascript
复制
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错误请求)

代码语言:javascript
复制
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有效负载

代码语言:javascript
复制
{
"version": "1.0",
"data":
[{"param1":name, "age":35},{"param1":name,"age":60}]
}

在python中,我使用了list of dict;在php中,我认为它只是数组的数组。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-10-30 21:12:29

在这样的情况下,我发现看一下线路上发生了什么总是比试图弄清楚代码可能出了什么问题更好。

我的建议是:

  • 使用python BaseHTTPServer创建一个小型测试服务器,并从BaseHTTPRequestHandler派生一个类,该类不做任何事情,只是提供do_POST方法的覆盖
  • 您的do_POST应该只是转储它收到的头和POST主体到文件

<>H19将您的代码样本指向这个小型测试服务器,然后比较它创建的文件。我猜,如果答案不是一目了然,你至少会得到一个或多个有用的线索来解决这个问题。--

票数 1
EN

Stack Overflow用户

发布于 2010-10-30 21:41:01

我不确定这是否会导致您的问题,但我确实看到了两者之间的区别:在python代码中,您发送两个标题行: Content-Type和Accept。而在PHP代码中,它们是一行。

票数 1
EN

Stack Overflow用户

发布于 2010-10-31 21:49:05

缺少参数索引- cURL POST字段需要作为查询字符串或数组发送。

以下任一项:

代码语言:javascript
复制
curl_setopt($ch, CURLOPT_POSTFIELDS, 'payload=' . urlencode($payload));

代码语言:javascript
复制
curl_setopt($ch, CURLOPT_POSTFIELDS, array('payload' => $payload));

payload替换为接口期望保存JSON字符串的参数的名称。

如果端点API不需要参数,那么它应该可以工作-它只是不会出现在测试脚本的POST数组中。您可以使用以下命令获取POST内容的正文

代码语言:javascript
复制
$data = file_get_contents("php://input");
var_dump($data);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4058405

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档