如何在PHP cURL请求中将OData发送到RESTful API
我正在尝试使用PHP将GET请求中的OData参数发送到RESTful API.对该服务的格式正确的OData请求如下所示:
I am trying to send OData parameters in a GET request to a RESTful API using PHP. A properly formatted OData request to this service looks like so:
https://myapi.org/endpoint?filter=family_name eq 'Doe'
似乎我应该在发送请求之前将这些变量附加到CURLOPT_URL
的末尾,但是API服务似乎没有收到OData.
It seems like I should just append these variables to the end of my CURLOPT_URL
before sending the request, but the API service doesn't seem to receive the 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
.考虑到相同的请求具有相同的标头和相同的Odata URL,这似乎是一个奇怪的响应.
Output is NULL
. This seems like a strange response considering that this same request with identical headers and the same Odata URL searches and finds the correct data in the API's browser.
有人可以确认这是否是通过cURL请求发送OData参数的正确方法吗?
Can anybody confirm whether or not this is the correct way to send OData parameters through a cURL request?
将OData参数直接附加到CURLOPT_URL
不起作用,因为它不能形成有效的URL.空格和引号需要以family_name%20eq%20%27Doe%27
或family_name+eq+%27Doe%27
进行转义.
Appending the OData parameters directly to the CURLOPT_URL
doesn't work, because it doesn't form a valid URL. The spaces and quotes need to be escaped as family_name%20eq%20%27Doe%27
or family_name+eq+%27Doe%27
.
一种更简单的方法是在设置CURLOPT_URL
之前使用http_build_query()
将参数附加到URL:
A simpler way would be to use http_build_query()
to attach the parameters to the URL prior to setting 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);