RESTFUL API URL 特殊字符的问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
dunhanson
V2EX    程序员

RESTFUL API URL 特殊字符的问题

  •  
  •   dunhanson 2019-06-16 11:07:27 +08:00 4270 次点击
    这是一个创建于 2323 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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-06-16 13:27:44 +08:00 via iPhone
    不过你一定要放 url 里,把 base64 两个特殊的符号转一下即可: https://stackoverflow.com/a/5835352
    当然我不觉得这种信息放 url 是个好主意(甚至包括放 query )
    k9982874
        2
    k9982874  
       2019-06-16 13:34:33 +08:00 via iPhone
    非要 base64 ?转 16 进制不就解决了?
    miao1007
        3
    miao1007  
       2019-06-16 13:47:42 +08:00
    全部用 PostRaw 就行了
    bertonzh
        4
    bertonzh  
       2019-06-16 13:49:50 +08:00
    不能用 file%2Fhello.txt 吗?
    chinvo
        5
    chinvo  
       2019-06-16 13:53:32 +08:00 via iPhone
    用 base62
    otakustay
        6
    otakustay  
       2019-06-16 15:59:24 +08:00
    所以改成?id=之后就不会有特殊字符了吗……
    Bromine0x23
        7
    Bromine0x23  
       2019-06-16 16:07:49 +08:00
    zhidian
        8
    zhidian  
       2019-06-16 16:14:32 +08:00
    encodeURIComponent
    zhidian
        9
    zhidian  
       2019-06-16 16:15:14 +08:00
    我好像理解错了...
    dunhanson
        10
    dunhanson  
    OP
       2019-06-16 16:27:03 +08:00
    @YuJianrong 就想问下有没有通用的解决办法
    dunhanson
        11
    dunhanson  
    OP
       2019-06-16 16:27:19 +08:00
    @k9982874 回头看看
    dunhanson
        12
    dunhanson  
    OP
       2019-06-16 16:28:35 +08:00
    @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-06-16 16:29:00 +08:00
    @Bromine0x23 前者不行,后者可以
    Bromine0x23
    &nsp;   14
    Bromine0x23  
       2019-06-16 16:40:56 +08:00
    @dunhanson 一般性的来说两种格式是都可以的(合法且参数可以被正确解析出来),从错误信息来看可能是服务器或者 Web 框架因为安全原因阻止了%2F 出现在 URI 中
    whoami9894
        15
    whoami9894  
       2019-06-16 16:46:11 +08:00 via Android
    尝试了几个 Web 框架,restful 风格的资源符 urlencode 后的%2F 还是会被识别为路径分割
    所以要么 url param 传参,要么换编码
    lianyue
        16
    lianyue  
       2019-06-16 16:57:17 +08:00
    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-06-16 17:19:09 +08:00
    urlsafe base64 了解一下。
    zk123
        18
    zk123  
       2019-06-17 06:55:57 +08:00 via iPhone
    正则匹配?
    dunhanson
        19
    dunhanson  
    OP
       2019-06-17 09:08:11 +08:00
    @whoami9894 感觉是由 url 传参的方式方便些,但是不知道是否符合规范,少了{id}
    dunhanson
        20
    dunhanson  
    OP
       2019-06-17 09:11:07 +08:00
    @zk123 哈哈哈 确实是一个思路,刚才搜了一篇文章,看上去可行的 回头试试
    dunhanson
        21
    dunhanson  
    OP
       2019-06-17 09:12:33 +08:00
    @JamesMackerel 嗯 之前有搜到过这类文章
    index90
        22
    index90  
       2019-06-17 10:33:47 +08:00
    直接: https://XXX.test.com/v1/files/{filepath}
    有什么问题?
    最多就是用不了框架的匹配取出来罢了,但是你可以直接操作 URL 啊。本来文件路径又是 URL 的一种。
    dunhanson
        23
    dunhanson  
    OP
       2019-06-17 11:50:12 +08:00
    @index90 有缘了,之前我也是这个头像
    ggicci
        24
    ggicci  
       2019-06-17 14:59:20 +08:00
    第一:RESTful 请保持使用 `/v1/files/{id}`,而不建议使用 `/v1/files?id=xxx`,如果不清楚为什么,请仔细阅读 RESTful 规范。

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

    第三:除非极其简单的 URL 字符串拼接,否则**一定**使用 URL 处理库来处理 URL,且遵循 URL 处理步骤:解码 -> 处理 -> 编码。各种 URL 处理库怎么使用请参考相应的文档。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2666 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 07:14 PVG 15:14 LAX 00:14 JFK 03:14
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86