PHP 带单引号的字符串 url 请求

PHP string with singlequotes for url request

有一些站点正在使用 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'

此处电子邮件用单引号括起来。我已经用 escaping:

尝试了单引号和双引号字符串
$query = 'https://domain.com/contacts/?$filter=email eq \'email@example.com\''
$query = "https://domain.com/contacts/?$filter=email eq 'email@example.com'"

None 成功了——我每次都收到请求错误。 但是,如果我 运行 在 ruby 中这样做——一切都按预期工作:

RestClient.get "https://domain.com/contacts/?$filter=email eq 'email@example.com'", []

我可以在这里做什么? PHP的版本是5.3.

https://domain.com/contacts/?$filter=email eq 'email@example.com'

这不是有效的 URI。有效的 URI 编码形式为:

https://domain.com/contacts/?%24filter=email%20eq%20'email%40example.com'

URLs 有某些 特殊字符 不能直接使用,但必须编码为 %.. 序列才能有效。您可以在 PHP 中使用 rawurlencode 执行此操作。您必须对项目 单独编码 :

$url = 'https://domain.com/contacts/?' . rawurlencode('$filter') . '=' . rawurlencode("email eq 'email@example.com'");

接收服务器是否接受 URL 是一个不同的话题,但至少你在这方面涵盖了基础知识。