2016-02-12 2 views
0

Я пытаюсь получить некоторые данные из веб-службы here (ботаническая таксономическая база данных). Сначала я попробовал со стороны клиента (Javascript/AJAX), но получал cross-domain restriction. Затем я переключился на сервер (PHP/cURL), но он не работает, мой сеанс падает во время запроса. Я следил за предложениями here, но все же он не работает.Не удается получить данные из API с помощью PHP + cURL

Что я делаю: я называю файл через AJAX, как

getMOBOT.php?genus=Ocotea&sp=guianensis 

getMOBOT.php файла:

<?php 
include_once '../../includes_pl/db_connect.php'; 
include_once '../../includes_pl/functions.php'; 
sec_session_start(); 
if (isset($_GET['genus'])) { 
    $genus = $_GET['genus']; 
    if (isset($_GET['sp'])) { 
     $sp = $_GET['sp']; 
     $curl = curl_init("http://services.tropicos.org/Name/Search?name=$genus+$sp&type=wildcard&apikey=[...]&format=xml"); 
     $curl_response = curl_exec($curl); // error! 
     curl_close($curl); 
     echo "It works!"; 
    } 
} 
?> 

Я читал, что мне нужно, чтобы закрыть сессию (session_write_close()) перед попыткой curl_exec (где мой сеанс отключен) и повторно открыть его позже (session_start()), но:

1) У меня есть специальная функция для безопасных сеансов, называемая sec_session_start(). Независимо от того, использую ли я его или по умолчанию session_start() (после curl_exec), ни одна из них не работает.

2) Поскольку в этом файле нет необходимости использовать сеанс, я удалил две строки include_once, а также sec_session_start(). Все еще не работает, я просто получаю пустой ответ (HttpReq.readyState == 4, HttpReq.status! = 200 и HttpReq.statusText == '').

3) Если я нахожу URL-адрес в браузере, он работает, что означает, что мой ключ действителен (который я не могу показать здесь, он заменяется на [...]).

EDIT: Изменены "curl_exec" линия для:

if (!curl_exec($curl)) { 
    die('Erro: "' . curl_error($curl) . '" - Code: ' . curl_errno($curl)); 
} else { 
    echo "It works!"; 
} 

, но до сих пор ничего не получают. Что я делаю неправильно, пожалуйста?

EDIT 2: Я за корпоративным прокси. Может быть, это (опять!) Проблема?

ответ

0

Да, это был прокси (снова)!

я только нужно добавить

$proxy = 'address:port'; 
$proxyauth = 'user:password'; 
curl_setopt($curl, CURLOPT_PROXY, $proxy); 
curl_setopt($curl, CURLOPT_PROXYUSERPWD, $proxyauth); 

в нужных местах.

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