2015-10-29 9 views
2

Я использую API Imgur для загрузки изображений. Они подробно изложили в своем API docs, что каждый запрос (когда я загружаю изображение через их API) также имеет заголовки ответов, которые расскажут, сколько кредитов у вас осталось.Получите заголовки ответа cURL, а также тело ответа

Мне нужно вернуть заголовок ответа HTTP X-RateLimit-ClientRemaining. Вот код, я в настоящее время используют, чтобы получить завиток тело обратно:

$filename = dirname(realpath(__FILE__))."/images/$value"; 
$client_id = "f*************c"; 
$handle = fopen($filename, "r"); 
$data = fread($handle, filesize($filename)); 
$pvars = array('image' => base64_encode($data)); 
$timeout = 30; 
$curl = curl_init(); 
curl_setopt($curl, CURLOPT_URL, 'https://api.imgur.com/3/image.json'); 
curl_setopt($curl, CURLOPT_TIMEOUT, $timeout); 
curl_setopt($curl, CURLOPT_HTTPHEADER, array('Authorization: Client-ID ' . $client_id)); 
curl_setopt($curl, CURLOPT_POST, 1); 
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($curl, CURLOPT_POSTFIELDS, $pvars); 
$out = curl_exec($curl); 
curl_close ($curl); 
$pms = json_decode($out,true); 
$url=$pms['data']['link']; 
if($url!=""){ 
    // add to success 
    array_push($success, $url); 
} 
else { 
    // add to fail 
    $p = $value.' failed, error: '.$pms['data']['error']; 
    array_push($fail, $p); 
} 

($value исходит из цикла я не включены)

+0

см мой пример ниже. – jpaljasma

ответ

0

Почему бы не попробовать

curl_setopt($curl, CURLOPT_HEADER, 1); 

Чтобы получить как заголовки, так и контент. Все, что вам нужно сделать, это разобрать заголовки из переменной $out.

Вот полностью рабочий пример при выборке из Google:

<?php 

error_reporting(E_ALL); 
ini_set('display_errors', 'On'); 
header('Content-Type: text/plain; charset=utf-8'); 

$curl = curl_init(); 
curl_setopt($curl, CURLOPT_URL, 'https://www.google.com/'); 
curl_setopt($curl, CURLOPT_TIMEOUT, 10); 
curl_setopt($curl, CURLOPT_POST, 0); 
curl_setopt($curl, CURLOPT_HEADER, 1); 
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); 
$out = curl_exec($curl); 
curl_close ($curl); 

$out = preg_split('/(\r?\n){2}/', $out, 2); 
$headers = $out[0]; 
$headersArray = preg_split('/\r?\n/', $headers); 
$headersArray = array_map(function($h) { 
    return preg_split('/:\s{1,}/', $h, 2); 
}, $headersArray); 

$tmp = []; 
foreach($headersArray as $h) { 
    $tmp[strtolower($h[0])] = isset($h[1]) ? $h[1] : $h[0]; 
} 
$headersArray = $tmp; $tmp = null; 
// $headersArray contains your headers 
print_r($headersArray); 
?> 

Это дает:

Array 
(
    [http/1.1 200 ok] => HTTP/1.1 200 OK 
    [date] => Thu, 29 Oct 2015 13:26:39 GMT 
    [expires] => -1 
    [cache-control] => private, max-age=0 
    [content-type] => text/html; charset=ISO-8859-1 
    [p3p] => CP="This is not a P3P policy! See http://www.google.com/support/accounts/bin/answer.py?hl=en&answer=151657 for more info." 
    [server] => gws 
    [x-xss-protection] => 1; mode=block 
    [x-frame-options] => SAMEORIGIN 
    [set-cookie] => NID=72=lw6pIMe05MoXu3aykbPi0BR9gZomWqTXBwsk6VG7xtLbLLeWc0I__CLGydE-auttR0G8VulKoZOTrv4eAZovJJi9QyB5hgxBue9pLWcX794Iv6gPlM2QaL9I2t6tjtrADtczAZpHhbnLvjmeDn_AmRj0xKkFPrMhYR84C5lNgzgo1iJpzr5qG2y6xg; expires=Fri, 29-Apr-2016 13:26:39 GMT; path=/; domain=.google.com; HttpOnly 
    [alternate-protocol] => 443:quic,p=1 
    [alt-svc] => quic="www.google.com:443"; p="1"; ma=600,quic=":443"; p="1"; ma=600 
    [accept-ranges] => none 
    [vary] => Accept-Encoding 
    [transfer-encoding] => chunked 
) 

Из вашего примера выше, вы бы искать $headersArray['x-ratelimit-clientremaining'];

Надежда, что помогает.

Edit: вот быстрый способ (потому что ваш ответ не содержит символы новой строки):

$matches = null; 
preg_match('/X-RateLimit-ClientRemaining:\s*(\d+)/i', $out, $matches); 
echo sprintf('X-RateLimit-ClientRemaining: %u', $matches[1]); 

Производит:

X-RateLimit-ClientRemaining: 11850 
+0

Не работает. Я вижу, что заголовки возвращаются, однако они не попадают в $ headersArray; все есть один элемент: [1] => строка (1) "1" – James

+0

Возможно, вам придется немного изменить функциональность для работы с вашим кодом - пример работает с www.google.com, но, вероятно, не с вашим api , Можете ли вы отправить мне ответ от вашего API в виде текста? Используйте gist, если необходимо ... Я настрою функцию парсинга. – jpaljasma

+0

https://gist.github.com/anonymous/05ba2c69f2fb45085da7 – James

Смежные вопросы