Я пытаюсь отправить параметры OData в запросе GET в API RESTful, используя 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?
Присоединение параметров 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);
Других решений пока нет …