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

RESTFUL API URL 特殊字符的问题

  •  
  •   dunhanson · 120 天前 · 1644 次点击
    这是一个创建于 120 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    第三:除非极其简单的 URL 字符串拼接,否则**一定**使用 URL 处理库来处理 URL,且遵循 URL 处理步骤:解码 -> 处理 -> 编码。各种 URL 处理库怎么使用请参考相应的文档。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   4231 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 48ms · UTC 09:05 · PVG 17:05 · LAX 02:05 · JFK 05:05
    ♥ Do have faith in what you're doing.