我正在尝试向yesmail api发出一个简单的GET请求,我有可以直接在浏览器中粘贴的URL并显示正确的信息,如果我添加以下代码,如简要文档中所示在Firefox RESTClient中,我得到了正确的答案:
GET https://services.yesmail.com/enterprise/subscribers?email=karina@email.co.uk HTTP/1.1
Accept-Encoding: gzip,deflate
User-Agent: Jakarta Commons-HttpClient/3.1
Authorization: Basic xxxxxxxxxxxxx
Host: services.yesmail.com
然而,当尝试使用CURL进行连接时,我什么都没得到,根本没有HTTP响应,只是一个空白页面。我不确定我做错了什么?这就是我所拥有的:
$url = "https://services.yesmail.com/enterprise/subscribers?email=karina@email.co.uk";
$header[] = "Accept-Encoding: gzip, deflate";
$header[] = "User Agent: Jakarta Commons-HttpClient/3.1";
$header[] = "Authorization: Basic xxxxxxxxxxxxx";
$header[] = "Host: services.yesmail.com";
$ch = curl_init();
curl_setopt($ch, CURLOPT_HTTPHEADER, $header );
curl_setopt($ch, CURLOPT_USERPWD, 'xxxxx:xxxxxxxxxx');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_URL, $url );
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true );
$response = (curl_exec($ch));
print_r($response);
curl_close($ch);
我认为我输入 RESTClient 的信息进入CURL的标题是错误的吗?这是我第一次使用API,所以任何帮助都是值得赞赏的。
更新
当使用函数file_get_contents
时,我得到了正确的响应(对于GET方法,它只是一个带有我唯一订阅者号码的URL):
$context = stream_context_create(array(
'http' => array(
'header' => "Authorization: Basic " . base64_encode("*******:********")
)
));
$data = file_get_contents('https://services.yesmail.com/enterprise/subscribers?email=karina@email.co.uk', false, $context);
echo $data;
但是我真的想让CURL方法正常工作,因为我希望能够添加订阅者。
答案 0 :(得分:1)
我实际上在Yesmail工作,所以我可以帮助你。
尝试使用以下代码(请务必将your-auth-here
文本替换为base64编码的身份验证信息,并在$ym_api_url
中设置相应的网址
<?php
// Set the HTTP headers needed for this API call.
$http_headers = array(
"Authorization: Basic your-auth-here",
"Accept: application/json",
"Connection: close", // Disable Keep-Alive
"Expect:" // Disable "100 Continue" server response
);
// URL Endpoint of the API to be called.
$ym_api_url = 'https://services.yesmail.com/enterprise/subscribers?email=karina@email.co.uk';
$curl_hdl = curl_init();
$curl_options = array(
CURLOPT_VERBOSE => 1, // Verbose mode for diagnostics
CURLOPT_HEADER => TRUE, // Include the header in the output.
CURLOPT_HTTPHEADER => $http_headers, // HTTP headers to set
CURLOPT_HTTPAUTH => CURLAUTH_BASIC, // Use basic authentication.
CURLOPT_PROTOCOLS => CURLPROTO_HTTPS, // Bitmask of protocols libcurl may use in this transfer
CURLOPT_RETURNTRANSFER => TRUE, // Return result as return value of curl_exec()
CURLOPT_URL => $ym_api_url, // URL to POST data to
);
curl_setopt_array($curl_hdl, $curl_options);
// Make the API call
$response = curl_exec($curl_hdl);
// Get the http response code
$http_response_code = curl_getinfo($curl_hdl, CURLINFO_HTTP_CODE);
curl_close($curl_hdl);
echo PHP_EOL . "INFO: HTTP Response Code was: " . $http_response_code . PHP_EOL;
if ( $response === false )
{
echo PHP_EOL . "ERROR: curl_exec() has failed." . PHP_EOL;
}
else
{
echo PHP_EOL . "INFO: Response Follows..." . PHP_EOL;
echo PHP_EOL . $response;
}
?>
CURLOPT_VERBOSE => 1
选项将输出其他诊断信息。请注意那里的任何问题,看看是否指向特定问题。一旦解决了问题,您可以删除或禁用这些选项。
此外,请记住,您可以随时联系您的Yesmail客户经理并请求帮助。
答案 1 :(得分:0)
所以你得到了$response
,但没有做任何事情。
您的代码中没有可以显示任何内容的行。
更新:我看到您更新了问题。
一条非常重要的规则:始终检查API调用的返回值。
curl_exec()
通过返回FALSE发出错误信号,如果是这种情况,请使用curl_error($ch)
进行检查。