我之前从未使用过JSON对象,但我认为这可能是我想要实现的最佳途径(如果你认为有更好的选择请告诉我,尽管我不能使用SOAP)< / p>
我正在尝试通过POST向API提交一些数据,以便将一些数据添加到存储为XML的新闻稿列表中。以下是我要完成的请求的文档:https://api.dotmailer.com/v2/help/wadl#PostAddressBookContacts
访问API网址并进行身份验证时,我会看到以下数据:
<ArrayOfApiContact xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://apiconnector.com">
<ApiContact>
<Id>1058905201</Id>
<Email>email@email.co.uk</Email>
<OptInType>Unknown</OptInType>
<EmailType>Html</EmailType>
<DataFields i:nil="true"/>
<Status>Subscribed</Status>
</ApiContact>
</ArrayOfApiContact>
所以我试图使用变量而不是硬编码电子邮件进行复制:
$xml = array(
'id' => urlencode('123456789'),
'email' => urlencode($useremail),
'optInType' => urlencode('Unknown'),
'emailType' => urlencode('Html'),
'dataFields' => urlencode(':null'),
'status' => urlencode('Subscribed')
);
我在这里组合数组:
foreach($xml as $key=>$value) { $xml_string .= $key.'='.$value.'&'; }
然后使用cURL将请求发送到API,并使用我的身份验证(apipassword
和apiemail
用户名)
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$auth_url);
curl_setopt($ch,CURLOPT_POST, count($xml));
curl_setopt($ch,CURLOPT_POSTFIELDS, $xml_string);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
curl_setopt($ch, CURLOPT_USERPWD, "$apiemail:$apipassword");
$status_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); //get status code
$result = curl_exec ($ch);
curl_close ($ch);
我已经在没有POST的情况下对此进行了测试,我确实以这种形式获取了数据:
[{"id":1058905201,"email":"email@email.co.uk","optInType":"Unknown","emailType":"Html","dataFields":null,"status":"Subscribed"}]
所以我知道auth工作正常并且数据正确回传,但现在当我尝试发布我的数据时,我得到了:
{"message":"Content type \"application/x-www-form-urlencoded\" is not supported. Please use one of: application/json,application/xml ERROR_CONTENT_TYPE_IS_NOT_SUPPORTED"}
那么如何将我编码的URL编码转换为API可读的内容?
答案 0 :(得分:1)
尝试内容类型application/json
,如下所示:
curl_setopt($ch, CURLOPT_HTTPHEADER, array('content-type: application/json'));
答案 1 :(得分:0)
这里有两件事(a)缺少内容类型头JSON,(b)有效负载不是JSON。
// setup request to send json via POST.
$payload = json_encode(array("json"=> $data)); // or json_encode(array($data));
curl_setopt( $ch, CURLOPT_POSTFIELDS, $payload );
// set proper content-type for sending JSON
curl_setopt( $ch, CURLOPT_HTTPHEADER, array('Content-Type:application/json'));