使用PHP发出GET请求

时间:2014-01-28 20:50:09

标签: php api http curl get

我正在尝试向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方法正常工作,因为我希望能够添加订阅者。

2 个答案:

答案 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)进行检查。