为什么我的cURL POST没有正确返回JSON?

时间:2016-07-08 15:50:41

标签: php json post curl docusignapi

在PHP中,我正在尝试检索DocuSign中不断刷新的特定页面的URL。检索此网址的POST格式为:

POST http://demo.docusign.net/restapi/{apiVersion}/accounts/{accountId}/envelopes/{envelopeId}/views/recipient

这应该以以下形式返回一个json文件:

{
  "url": "example.example.com"
}

但是,我对使用PHP和POST方法非常陌生,并且不相信我正确地这样做了。此方法的API资源管理器特别是here。我正在使用cURL方法来发出此请求。这是我的代码($recipient$account_id$access_token在另一个文件中准确找到):

$url = "http://demo.docusign.net/restapi/v2/accounts/$account_id
         /envelopes/$envelope_id/views/recipient";

$body = array("returnUrl" => "http://www.docusign.com/devcenter",
              "authenticationMethod" => "None",
              "email" => "$recipient",
              "userName" => "$recipient");

$body_string = json_encode($body);

$header = array(
    'Accept: application/json',
    'Content-Type: application/json',
    'Content-Length: '.strlen($body_string),
);

$curl = curl_init($url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $body_string);

$json_response = curl_exec($curl);
$response = json_decode($json_response, true);

var_dump($response);

我能够在API资源管理器上获得正确的回报,但在使用PHP发出请求时却没有。我认为这是因为我没有正确地合并$header$body,但此时我还不确定。

已添加:这是在API Explorer上正确运行该方法时请求的原始输出:

接受:application / json
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en; q = 0.8,fa; q = 0.6,sv; q = 0.4
缓存控制:无缓存
来源:https://apiexplorer.docusign.com
推荐人:https://apiexplorer.docusign.com/
用户代理:Mozilla / 5.0(Macintosh; Intel Mac OS X 10_11_5)
AppleWebKit / 537.36(KHTML,与Gecko一样)Chrome / 51.0.2704.103 Safari / 537.36
授权:持票人fGehcK7fkRvFguyu / 7NGh01UUFs =
内容长度:
内容类型:application / json

这是我的代码中形成的JSON请求:

{
  "returnUrl":"http:\/\/www.docusign.com\/devcenter",
  "authenticationMethod":"Password",
  "email":"example@example.com",
  "userName":"example@example.com",
  "clientUserId":"4c6228f4-fcfe-47f9-bee1-c9d5e6ab6a41",
  "userId":"example@example.com"
}

3 个答案:

答案 0 :(得分:1)

您没有在cURL代码中点击有效的DocuSign网址。现在您要发送请求:

http://demo.docusign.net/apiVersion/v2/accounts/{accountId}/envelopes/{envelopeId}/views/recipient

而不是" apiVersion"它应该是" restApi"像这样:

http://demo.docusign.net/restapi/v2/accounts/{accountId}/envelopes/{envelopeId}/views/recipient

答案 1 :(得分:0)

我们无法发送帖子字段,因为我们想发送JSON,而不是假装成一个表单(接受带有表格格式数据的POST请求的API的优点是一个有趣的争论)。相反,我们创建正确的JSON数据,将其设置为POST请求的主体,并正确设置标头,以便接收此请求的服务器将了解我们发送的内容:

$data = array("name" => "Hagrid", "age" => "36");                                                                    
$data_string = json_encode($data);                                                                                   

$ch = curl_init('http://api.local/rest/users');                                                                      
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");                                                                     
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);                                                                  
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);                                                                      
curl_setopt($ch, CURLOPT_HTTPHEADER, array(                                                                          
    'Content-Type: application/json',                                                                                
    'Content-Length: ' . strlen($data_string))                                                                       
);                                                                                                                   

$result = curl_exec($ch);

所有这些设置都在curl_setopt()页面上得到了很好的解释,但基本上我的想法是将请求设置为POST请求,将json编码的数据设置为正文,然后设置正确用于描述帖子正文的标题。 CURLOPT_RETURNTRANSFER完全是为了使来自远程服务器的响应放在$ result中而不是回显。如果您使用PHP发送JSON数据,我希望这可能有所帮助!

答案 2 :(得分:0)

我知道这个问题是3年前问的,但这可能会对发现此问题的人有所帮助,因为他们遇到了同样的问题。我看不到cURL选项可以解码您代码中的响应。我发现我需要像这样使用cURL选项CURLOPT_ENCODINGcurl_setopt($ch,CURLOPT_ENCODING,"");根据在线PHP手册,它说,'CURLOPT_ENCODING-“ Accept-Encoding:”标头的内容。这使得能够解码响应。支持的编码为“身份”,“放气”和“ gzip”。如果设置了空字符串“”,则将发送包含所有受支持的编码类型的标头。您可以在https://www.php.net/manual/en/function.curl-setopt.php上找到此选项。我希望这可以帮助某人免于头痛。