dunhanson
V2EX  ›  程序员

RESTFUL API URL 特殊字符的问题

By dunhanson at 2019 年 6 月 16 日 · 4906 次点击

GET 请求,RESTFUL 风格是 https://XXX.test.com/v1/files/{id}

这个 id 我不是真正的 id,我要放的是一个路径参数,比如:file/hello.txt

我尝试过用,URL 编码+BASE64,但是还是会遇到最后的编码会出现特殊字符的情况

还是说取消{id}这个参数,直接把 “ file/hello.txt ”

改成 https://XXX.test.com/v1/files?id=file/hello.txt

24 条回复  •  2019-06-17 14:59:20 +08:00
YuJianrong
   1
YuJianrong  
   2019 年 6 月 16 日 via iPhone
不过你一定要放 url 里,把 base64 两个特殊的符号转一下即可: https://stackoverflow.com/a/5835352
当然我不觉得这种信息放 url 是个好主意(甚至包括放 query )
k9982874
   2
k9982874  
   2019 年 6 月 16 日 via iPhone
非要 base64 ?转 16 进制不就解决了?
miao1007
   3
miao1007  
   2019 年 6 月 16 日
全部用 PostRaw 就行了
bertonzh
   4
bertonzh  
   2019 年 6 月 16 日
不能用 file%2Fhello.txt 吗?
chinvo
   5
chinvo  
   2019 年 6 月 16 日 via iPhone
用 base62
otakustay
   6
otakustay  
   2019 年 6 月 16 日
所以改成?id=之后就不会有特殊字符了吗……
zhidian
   8
zhidian  
   2019 年 6 月 16 日
encodeURIComponent
zhidian
   9
zhidian  
   2019 年 6 月 16 日
我好像理解错了...
dunhanson
   10
dunhanson  
OP
   2019 年 6 月 16 日
@YuJianrong 就想问下有没有通用的解决办法
dunhanson
   11
dunhanson  
OP
   2019 年 6 月 16 日
@k9982874 回头看看
dunhanson
   12
dunhanson  
OP
   2019 年 6 月 16 日
@bertonzh 不行,会报错的

HTTP Status 400 – Bad Request
Type Status Report

Message Invalid URI: noSlash

Description The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).
dunhanson
   13
dunhanson  
OP
   2019 年 6 月 16 日
@Bromine0x23 前者不行,后者可以
Bromine0x23
   14
Bromine0x23  
   2019 年 6 月 16 日
@dunhanson 一般性的来说两种格式是都可以的(合法且参数可以被正确解析出来),从错误信息来看可能是服务器或者 Web 框架因为安全原因阻止了%2F 出现在 URI 中
whoami9894
   15
whoami9894  
   2019 年 6 月 16 日 via Android
尝试了几个 Web 框架,restful 风格的资源符 urlencode 后的%2F 还是会被识别为路径分割
所以要么 url param 传参,要么换编码
lianyue
   16
lianyue  
   2019 年 6 月 16 日
https://XXX.test.com/v1/files/file/txt.txt
就好了啊
*匹配 就好了
*file

https://XXX.test.com/v1/files/{*file}

基本所有框架 都有这样匹配的吧
比如 gin 的
https://github.com/gin-gonic/gin#parameters-in-path
JamesMackerel
   17
JamesMackerel  
   2019 年 6 月 16 日
urlsafe base64 了解一下。
zk123
   18
zk123  
   2019 年 6 月 17 日 via iPhone
正则匹配?
dunhanson
   19
dunhanson  
OP
   2019 年 6 月 17 日
@whoami9894 感觉是由 url 传参的方式方便些,但是不知道是否符合规范,少了{id}
dunhanson
   20
dunhanson  
OP
   2019 年 6 月 17 日
@zk123 哈哈哈 确实是一个思路,刚才搜了一篇文章,看上去可行的 回头试试
dunhanson
   21
dunhanson  
OP
   2019 年 6 月 17 日
@JamesMackerel 嗯 之前有搜到过这类文章
index90
   22
index90  
   2019 年 6 月 17 日
直接: https://XXX.test.com/v1/files/{filepath}
有什么问题?
最多就是用不了框架的匹配取出来罢了,但是你可以直接操作 URL 啊。本来文件路径又是 URL 的一种。
dunhanson
   23
dunhanson  
OP
   2019 年 6 月 17 日
@index90 有缘了,之前我也是这个头像
ggicci
   24
ggicci  
   2019 年 6 月 17 日
第一:RESTful 请保持使用 `/v1/files/{id}`,而不建议使用 `/v1/files?id=xxx`,如果不清楚为什么,请仔细阅读 RESTful 规范。

第二:路径中的 `{id}` 内容需要编码,类似于 `urlencode` 之类的函数,但是更推荐使用 URL 处理库处理一整个 URL 对象。

第三:除非极其简单的 URL 字符串拼接,否则**一定**使用 URL 处理库来处理 URL,且遵循 URL 处理步骤:解码 -> 处理 -> 编码。各种 URL 处理库怎么使用请参考相应的文档。
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
© 2026 V2EX · 86ms · 3.9.8.5