2013-11-17 5 views
1

Это первый вопрос, когда-либо, поэтому я сделаю все возможное.PHP curl для sc2ranks.com API

фона Я работаю на небольшом сайте Starcraft II, который использует API из хорошо известной website. После просмотра документации, которую я получил пример работает довольно быстро, возвращая код JSON:

curl -X POST 'http://api.sc2ranks.com/v2/characters/search' -d 'name=Wodan&bracket=1v1&league=gold&expansion=hots&rank_region=global&api_key='<api_key>' 

Надеясь для легкой езды я создал небольшой скрипт, который выполняет HTTP-GET запроса на API возвращении базы статистика для каждого пользователя в игре. Этот URL-адрес может быть конечно образованы непосредственно в браузере:

http://api.sc2ranks.com/v2/characters/eu/1616021?api_key=<api_key> 

Это обрабатывается в моем коде следующим образом (примечание: $ URL является выше URL и $ this-> сеанс инициализации завитка):

curl_setopt($this->session,CURLOPT_URL, $url); 
    curl_setopt($this->session,CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($this->session,CURLOPT_HEADER, true); 

    if(!$result = curl_exec($this->session)) 
     exit("cURL Error: " . curl_error($this->session)); 
    else 
     return $result;  

проблема Ну на моем пути я решил использовать более продвинутые функции API, чтобы получить более подробную информацию о элементе. Однако здесь начинается путаница. Оглядываясь назад на вышеупомянутый оригинальный curl post в терминале, он показывает два варианта. -X (запрос) и -d (данные для сообщения). Выяснение первым будет правильным URL сделать запрос HTTP-POST к и позднее время данные, я придумал следующий пример:

$url = "http://api.sc2ranks.com/v2/characters/search/"; 
    $data = "league=all&rank_region=global&expansion=hots&bracket=1v1&name=Wodan?api_key=<my_key>";   

    curl_setopt($this->session, CURLOPT_CUSTOMREQUEST, "POST");                  
    curl_setopt($this->session, CURLOPT_POSTFIELDS, $data);                 
    curl_setopt($this->session, CURLOPT_RETURNTRANSFER, true);                  
    curl_setopt($this->session, CURLOPT_HTTPHEADER, array(                   
     'Content-Type: text/html',                     
     'Content-Length: ' .strlen($data))                  
    ); 
    if(!$result = curl_exec($this->session)) 
     exit("cURL Error: " . curl_error($this->session)); 
    else 
     return $result; 

Я также попытался пройти выше через, как JSON формат.

Выход В результате я только получаю следующее в качестве ответа сервера: String '{' was not found in 'HTTP/1.1 404 Not Found Server: nginx Date: Sun, 17 Nov 2013 22:14:03 GMT Content-Type: text/html; charset=utf-8 Content-Length: 0 Connection: close Status: 404 Not Found X-Request-Id: 700726570451c891d48862edfc8545fb X-Runtime: 0.009002 X-Rack-Cache: invalidate, pass '

То, что я думаю, что будет неправильно Скорее всего, я не формируя запрос прямо на сервер, или мне нужно для таргетинга на определенный файл, а затем они задокументировали его. Здесь я нашел два похожих вопроса относительно POST с Curl. Но они мало помогли мне, и я чувствую, что это может помочь большему количеству людей.

Надеюсь, у кого-то в этом сообществе есть некоторый опыт работы с curl или фактическим API.

+0

Я бы не стал напрямую использовать cURL, использовать подходящий клиент API. Я использую использование [Pest] (https://github.com/educoder/pest) - простой и эффективный. – halfer

+0

@halfier Спасибо за ваш ответ. Это может быть альтернатива, но это не ответ на мой вопрос. Хотя я мог бы использовать Pest, в конце концов я все еще просто должен знать, что происходит неправильно. – mkoster

+0

Это не прямой ответ, нет, но это полезно. – halfer

ответ

0

Привет народ и поблагодарить всех вас за вашу помощь! Я решил проблему самостоятельно, но мне пришлось прокручивать PHP manual для самого setopt. Это следующий код, который работает: $ ch = curl_init();

curl_setopt($ch, CURLOPT_URL,"http://api.sc2ranks.com/v2/characters/search"); 
    curl_setopt($ch, CURLOPT_POST, true); 
    curl_setopt($ch, CURLOPT_POSTFIELDS,"name=Wodan&bracket=1v1&league=gold&expansion=hots&rank_region=global&api_key=<my_key>"); 
    //curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_exec ($ch); 
    curl_close ($ch); 

Обратите внимание на приведенную выше строку выше. Руководство Сэя следующее о CURLOPT_RETURNTRANSFER:

TRUE, чтобы вернуть передачи в виде строки из возвращаемого значения curl_exec() вместо выводить его непосредственно.

Поскольку этот пример не является HTTP-запросом GET, а HTTP POST-запросом, прямой URL-адрес не будет получен из URL-адреса. Когда установлено значение false, он будет собирать любой возвращаемый результат.

Мое толкование руководства может быть неправильным, но это, по крайней мере, решило проблему. Надеюсь, это поможет другим людям. Спасибо всем за вашу помощь.

0

используйте следующий код

$apiParams = array ("league" => "all", 
       "rank_region" => "global", 
       "expansion" => "hots", 
       "bracket" => "1v1", 
       "name" => "Wodan", 
       "api_key" => "<my_key>"); 


$Url = "http://api.sc2ranks.com/v2/characters/search"; 

$curlHandler = curl_init($Url); 

curl_setopt($curlHandler, CURLOPT_POST, true); 
curl_setopt($curlHandler, CURLOPT_POSTFIELDS, $apiParams); 
curl_setopt($curlHandler, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($curlHandler, CURLOPT_HTTPHEADER, array(                   
    'Content-Type: text/html',                     
    'Content-Length: ' .strlen($data))                  
); 
$statusCode = curl_exec($curlHandler); 

curl_close($curlHandler);