httr 有时会在 URL 中将“%”替换为“%25”
Posted
技术标签:
【中文标题】httr 有时会在 URL 中将“%”替换为“%25”【英文标题】:httr replaces "%" with "%25" in URL sometimes 【发布时间】:2020-01-16 23:11:41 【问题描述】:当使用httr::GET
时,在某些查询中它会用安全表示%25
替换%
,但在其他查询中它不会。我找不到任何可以做到这一点的规则。
我使用的是 httr 1.4.1
%
被替换的示例查询(注意错误代码,输入的 URL 与返回的响应对象不同):
> httr::GET("jira.spring.io/rest/api/latest/search?jql=project=Spring%20Framework&startAt=0")
Response [https://jira.spring.io/rest/api/latest/search?jql=project=Spring%2520Framework&startAt=0]
Date: 2020-01-16 22:57
Status: 400
Content-Type: application/json;charset=UTF-8
Size: 196 B
查询没有被替换的地方(没有错误,响应的 URL 与输入的相同):
> httr::GET("issues.jenkins-ci.org/rest/api/latest/search?jql=project='WEBSITE'%20OR%20project='Infrastructure'&startAt=0")
Response [https://issues.jenkins-ci.org/rest/api/latest/search?jql=project='WEBSITE'%20OR%20project='Infrastructure'&startAt=0]
Date: 2020-01-16 23:02
Status: 200
Content-Type: application/json;charset=UTF-8
Size: 430 kB
发生了什么事?这是httr中的错误吗?还是我应该更改GET()
调用中的一些参数?
【问题讨论】:
我可能遇到了问题,但提出了不同的根本原因 -modifyList
函数将 %
替换为 %25
***.com/q/60160208/199217
【参考方案1】:
tldr; 在 jira.spring.io 中使用 HTTPS 请求以避免协议升级失败。
这不是 R/HTTR 问题。是网站。比较 HTTP(“失败并神秘 %25”)和 HTTPS(“成功”)的结果:
http://jira.spring.io/rest/api/latest/search?jql=project=Spring%20Framework&startAt=0
"errorMessages":["JQL 查询中的错误:字符 '%' 是保留的 JQL 字符。您必须将其括在字符串中或改用转义符 '\u0025'。(第 1 行,字符 15 )"],"错误":
https://jira.spring.io/rest/api/latest/search?jql=project=Spring%20Framework&startAt=0
"errorMessages":["JQL 查询中的错误:期望 'OR' 或 'AND' 但得到了 'Framework'。(第 1 行,字符 16)"],"errors":
HTTP -> HTTPS 重定向协议升级中似乎存在“故障”,它具有以下响应标头:
Status Code: 301 Moved Permanently
Location: https://jira.spring.io/rest/api/latest/search?jql=project=Spring%252520Framework&startAt=0
^^^^^
因此一个解决方案是使用 HTTPS 端点并避免奇怪的目标位置..
【讨论】:
我对 https 不太了解,但这是否与我在此处发现的相同或类似问题一致:***.com/q/60160208/199217? 上面的问题也会影响“普通”浏览器,让它跟随 302。上面的这种情况明确与重定向有关.. 虽然看起来很相似。 :|稍后我会看到 Postman 如何使用相同的 302 .. 如果/当我记得的时候。 @DavidLeBauer 在上面的案例中,确实是jira.spring.io网站的错误;或者 Chrome、IE 和 Postman 都是“错误的”:-) 我想知道 r/httr 是否支持(甚至可能是意外地)“auto fixup” 这样的 URL删除?另外,请考虑这个问题only 适用于invalid 30x response 重定向。发送的原始查询是正确的。以上是关于httr 有时会在 URL 中将“%”替换为“%25”的主要内容,如果未能解决你的问题,请参考以下文章
使用 httr GET 时不考虑 If-Modified-Since?