Как отправить OData в RESTful API в PHP cURL Request

3 Typel [2016-02-19 21:25:00]

Я пытаюсь отправить параметры OData в GET-запрос RESTful API с помощью PHP. Правильно отформатированный запрос OData для этой службы выглядит следующим образом:

https://myapi.org/endpoint?filter=family_name eq 'Doe'

Кажется, что я должен просто добавить эти переменные в конец моего CURLOPT_URL перед отправкой запроса, но служба API, похоже, не получает OData.

$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 100);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('OSDI-API-Token:xxxxxxxxxxxx'));
curl_setopt($ch, CURLOPT_URL, "https://myapi.org/endpoint?filter=family_name eq 'Doe'");
$response = curl_exec($ch);
curl_close($ch);

echo "<pre>";
print_r($response);
echo "</pre>";

Вывод NULL. Это кажется странным ответом, учитывая, что этот же запрос с идентичными заголовками и одним и тем же URL-адресом Odata ищет и находит правильные данные в браузере API.

Может ли кто-нибудь подтвердить, является ли это правильным способом отправки параметров OData с помощью запроса cURL?

api php curl odata


1 ответ


7 Решение Typel [2016-02-19 22:04:00]

Добавление параметров OData непосредственно к CURLOPT_URL не работает, потому что оно не образует действительный URL. Пробелы и кавычки должны быть экранированы как family_name%20eq%20%27Doe%27 или family_name+eq+%27Doe%27.

Простейшим способом было бы использовать http_build_query() для присоединения параметров к URL до установки CURLOPT_URL:

$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 100);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('OSDI-API-Token: xxxxxxxxxx'));
$api_request_parameters = array('filter'=>"family_name eq 'Doe'");
$api_request_url = "https://myapi.org/endpoint";
$api_request_url .= "?".http_build_query($api_request_parameters);
$curl_setopt($ch, CURLOPT_URL, $api_request_url);
$response = curl_exec($ch);
curl_close($ch);