php - PHP - 通过 RFC 1738 对自定义 URL 进行编码
问题描述
我正在尝试从特定的 API 获取一些数据。如果我在 API 页面上进行测试运行,他们会将这个 url 作为响应返回给我,这样我就可以从那里获取 api 数据:
(仅类别片段)
&categories=1%2C2%2C3%2C4%2C5%2C6%2C7%2C8%2C9%2C10%2C11%2C12"
基本上这意味着:1,2,3,4,5,6,7,8,9,10,11,12
我有一个类别数组,也有 12 个元素。
数组如下所示:
dd($this->categories) outputs:
array:12 [▼
0 => "1"
1 => "2"
2 => "3"
3 => "4"
4 => "5"
5 => "6"
6 => "7"
7 => "8"
8 => "9"
9 => "10"
10 => "11"
11 => "12"
]
要从我的系统发出 api 请求,我调用的 url 必须具有与 api 测试相同的标准。但是,这就是我的 URL 的样子(仅类别片段)
&categories=%5B%221%22%2C%222%22%2C%223%22%2C%224%22%2C%225%22%2C%226%22%2C%227%22%2C%228%22%2C%229%22%2C%2210%22%2C%2211%22%2C%2212%22%5D
代码片段:
$categories = "&categories=" . rawurlencode(json_encode($this->categories));
如您所见,api 测试的 url 片段比我的要短得多。我认为那是因为编码?
我尝试通过先将数组转换为 json 并在其上使用 rawurlencode 方法来解决它。但这并没有为我解决问题。我需要以同样的方式“转换”url,api会做到这一点。
有谁知道我该如何解决这个问题?
我发现了什么:
我发现这个片段几乎解决了我的问题
$categories = "&categories=" . http_build_query($this->categories, null, "%2C", PHP_QUERY_RFC1738);
结果如下所示:
&categories=0=1%2C1=2%2C2=3%2C3=4%2C4=5%2C5=6%2C6=7%2C7=8%2C8=9%2C9=10%2C10=11%2C11=12
但是我真的不知道开头的 ne 0 是从哪里来的,为什么每个数组元素后面总是有一个“=”字符
解决方案
如果您检查变量,您会发现 URL 编码与问题无关:
var_dump(rawurldecode('categories=%5B%221%22%2C%222%22%2C%223%22%2C%224%22%2C%225%22%2C%226%22%2C%227%22%2C%228%22%2C%229%22%2C%2210%22%2C%2211%22%2C%2212%22%5D'));
string(63) "categories=["1","2","3","4","5","6","7","8","9","10","11","12"]"
请比较:
$categories = array('1', '2', '3');
var_dump(json_encode($categories));
var_dump(implode(',', $categories));
string(13) "["1","2","3"]"
string(5) "1,2,3"
http_build_query()
这里是矫枉过正。您实际上并没有任何复杂的结构,只有一个字符串变量。
推荐阅读
- codeigniter - 忘记密码不发送电子邮件验证(Codeigniter)
- javascript - JavaScript 中奇怪的数组行为
- jquery - 删除子表上的过滤器(jquery)
- arrays - 在 C 中遍历用户输入和多维数组
- docker - 为什么我无法从 docker 访问 tomcat 网页?
- python - 为什么 Model.fit() 和 Model.evaluate() 在同一个 val 集上的结果不同?
- postgresql - postgresql [42883] 错误:函数 to_tsvector("unknown", "unknown") 不存在
- javascript - 如何在动态调整高度的反应项目中使用垂直线?
- php - 我们可以在“while”中简化“while”吗?
- go - 使用 discordgo 在 MessageEvent 上获得回复消息