使用 CURL 将 JSON 数据发布到 API

Posted

技术标签:

【中文标题】使用 CURL 将 JSON 数据发布到 API【英文标题】:Posting JSON data to API using CURL 【发布时间】:2013-09-09 22:53:44 【问题描述】:

当我使用 curljson 数据发布到 API 时 - 我没有得到任何输出。我想向收件人发送电子邮件邀请。

$url_send ="http://api.address.com/SendInvitation?";
$str_data = json_encode($data);

function sendPostData ($url, $post) 

    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post));

    return curl_exec($ch);

这里是JSON $str_data

[
    
        "authorizedKey"  : "abbad35c5c01-xxxx-xxx",
        "senderEmail"    : "myemail@yahoo.com",
        "recipientEmail" : "jaketalledo86@yahoo.com",
        "comment"        : "Invitation",
        "forceDebitCard" : "false"
    
] 

以及调用函数:

$response = sendPostData($url_send, $str_data);

这是 API:https://api.payquicker.com/Help/Api/POST-api-SendInvitation

【问题讨论】:

【参考方案1】:

您不需要像 json_encode 那样添加标题。 只需print_r (curl_getinfo($ch)); 并查看其中的内容类型信息。

【讨论】:

【参考方案2】:

你必须添加标题:

$headers= array('Accept: application/json','Content-Type: application/json'); 

还有:

curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

否则...

HTTP 状态 415 - 不支持的媒体类型

...可能会发生。

【讨论】:

【参考方案3】:

尝试添加curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 并将http_build_query($post) 更改为$post

实现:

<?php

$data = array(
  "authorizedKey" => "abbad35c5c01-xxxx-xxx",
  "senderEmail" => "myemail@yahoo.com",
  "recipientEmail" => "jaketalledo86@yahoo.com",
  "comment" => "Invitation",
  "forceDebitCard" => "false"
);

$url_send ="http://api.payquicker.com/api/SendInvitation?authorizedKey=xxxxx";
$str_data = json_encode($data);

function sendPostData($url, $post)
  $ch = curl_init($url);
  curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");  
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($ch, CURLOPT_POSTFIELDS,$post);
  curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
  $result = curl_exec($ch);
  curl_close($ch);  // Seems like good practice
  return $result;


echo " " . sendPostData($url_send, $str_data);

?>

我得到的回应是:

"success":false,"errorMessage":"Object reference not set to an instance of an object.","status":"N/A"

但也许它适用于有效数据....

编辑: 对于发布 xml, 它和他们网站上的一样,除了在一个字符串中:

$xml = '
<SendInvitationRequest xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/PQApi.Models">
  <authorizedKey>80c587b9-caa9-4e56-8750-a34b17dba0a2</authorizedKey>
  <comment>sample string 4</comment>
  <forceDebitCard>true</forceDebitCard>
  <recipientEmail>sample string 3</recipientEmail>
  <senderEmail>sample string 2</senderEmail>
</SendInvitationRequest>';

然后:

sendPostData($url_send, $xml)

【讨论】:

我刚刚在他们的 api 上读到“请使用 ?authorizedKey=xxxxx 将其附加到 url”,我也会更改上面的代码 我需要用我的身份验证密钥分配那个 xxxx 吗?? 我仍然得到 "success":false,"errorMessage":"Object reference not set to an instance of an object.","status":"N/A" 我尝试联系那里的支持人员,因为无论如何我仍然遇到该错误,非常感谢您花时间回答我的问题 希望对你有用! -我正在考虑尝试使用 xml 而不是 json,因为我尝试了使用 xml 的其他 api 调用之一并且它起作用了。

以上是关于使用 CURL 将 JSON 数据发布到 API的主要内容,如果未能解决你的问题,请参考以下文章

如何发送 JSON 并使用 cURL 检索它?

调用 mandrill api 时连接拒绝 curl 错误

将参数发布到 Rest API

Bash CURL GET 请求输出到单个 JSON 文件,包括服务器响应和 CURL 信息

使用 CORS 到 API 网关的 AJAX POST 不起作用,但可以使用 CURL 进行 POST

将 CURL 与 discord.js 和 5sim API 一起使用