V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
dunhanson
V2EX  ›  程序员

RESTFUL API URL 特殊字符的问题

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

    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
        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   ·   实用小工具   ·   2856 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 12:32 · PVG 20:32 · LAX 04:32 · JFK 07:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.