有一些网站,whitch使用odata协议进行api访问。 例如,要加载具有特定状态ID的用户,我可以使用此URL:
https://domain.com/contacts/?$filter=status_id eq 1
简单明了。在这种情况下,我只是定义一个字符串并使用curl获得预期的响应:
$ch = curl_init();
$query = 'https://domain.com/contacts/?$filter=status_id eq 1'
curl_setopt($ch, CURLOPT_URL, $query);
$response = curl_exec($ch);
但真正的问题始于此:
https://domain.com/contacts/?$filter=email eq 'email@example.com'
此处电子邮件包含单引号。我已尝试使用转义单引号和双引号:
$query = 'https://domain.com/contacts/?$filter=email eq \'email@example.com\''
$query = "https://domain.com/contacts/?\$filter=email eq 'email@example.com'"
这些都没有奏效 - 我每次都收到请求错误。 但是,如果我在ruby中运行它 - 一切都按预期运行:
RestClient.get "https://domain.com/contacts/?$filter=email eq 'email@example.com'", []
我可以在这做什么? PHP的版本是5.3。
答案 0 :(得分:2)
https://domain.com/contacts/?$filter=email eq 'email@example.com'
这不是有效的URI。有效的URI编码形式为:
https://domain.com/contacts/?%24filter=email%20eq%20'email%40example.com'
网址包含某些特殊字符,您无法直接使用这些特殊字符,但必须将其编码为%..
个序列才能生效。您可以使用rawurlencode
在PHP中执行此操作。您必须单独编码项目::
$url = 'https://domain.com/contacts/?' . rawurlencode('$filter') . '=' . rawurlencode("email eq 'email@example.com'");
接收服务器是否接受该URL是一个不同的主题,但至少您已经覆盖了最终的基础知识。