V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
Wallace007
V2EX  ›  Python

为什么在编写 web api 时候每种请求方法都要写呢

  •  
  •   Wallace007 · 2019-05-15 22:49:13 +08:00 · 4184 次点击
    这是一个创建于 1779 天前的主题,其中的信息可能已经有所发展或是发生改变。

    请教大佬 为什么在编写 web api 时候每种请求方法都要写呢

    21 条回复    2019-05-16 15:23:39 +08:00
    uhian
        1
    uhian  
       2019-05-15 23:23:49 +08:00
    如果有一种请求你没写但是别人用了,你的程序会怎么样?
    sunzongzheng
        2
    sunzongzheng  
       2019-05-15 23:34:28 +08:00 via Android
    为了满足 curd ?
    chinvo
        3
    chinvo  
       2019-05-16 00:41:42 +08:00 via iPhone
    因为不写就不能用
    rbe
        4
    rbe  
       2019-05-16 00:53:45 +08:00
    @uhian #1 405 Method Not Allowed
    LokiSharp
        5
    LokiSharp  
       2019-05-16 00:59:18 +08:00 via iPhone
    直接映射数据库就不用写了
    Trim21
        6
    Trim21  
       2019-05-16 02:15:29 +08:00 via Android
    你要不想提供也可以不写
    a11214214
        7
    a11214214  
       2019-05-16 08:25:18 +08:00
    为了 rest 设计?
    leonme
        8
    leonme  
       2019-05-16 08:48:15 +08:00 via Android
    我估计那个类似什么 APIJSON 的老哥又要来推广了 2333
    DOLLOR
        9
    DOLLOR  
       2019-05-16 08:56:05 +08:00
    只要胆子大,你甚至可以让前端用 JS 拼接 SQL 并提交,然后直接拿到数据库的结果 233
    conn4575
        10
    conn4575  
       2019-05-16 09:03:26 +08:00 via Android
    不支持的操作就可以不写啊
    lzj307077687
        11
    lzj307077687  
       2019-05-16 09:04:25 +08:00
    反正我只写一种
    Yarnus
        12
    Yarnus  
       2019-05-16 09:07:01 +08:00 via iPhone
    Restful
    vincel
        13
    vincel  
       2019-05-16 09:07:04 +08:00
    @DOLLOR 只要胆子大 你甚至可以让前端直接把数据存在 cookie 里面,后端在旁边喊 666 就行了 233
    shuAS
        14
    shuAS  
       2019-05-16 09:12:35 +08:00
    只要胆子大,你甚至可以直接把后台 /服务器密码留在前端页面上,想要自己去写,多简单 233
    annielong
        15
    annielong  
       2019-05-16 09:20:47 +08:00
    有需要再加吧,
    jiejiss
        16
    jiejiss  
       2019-05-16 09:30:59 +08:00
    只要胆子大,你甚至可以把所有数据库的数据转成 JSON 嵌在页面里,让前端读取去做查询
    airfling
        17
    airfling  
       2019-05-16 09:42:46 +08:00
    也不是,spring data rest api 就是你定义好 domain 后,把那个 repository 继承下就有基础的 crud 方法了,但是往往实际你用起来需要加点逻辑,而不是简单的存储查询
    CallMeHoney
        18
    CallMeHoney  
       2019-05-16 09:47:04 +08:00
    可以用一些类似于 tastypie 的框架
    zhengjian
        19
    zhengjian  
       2019-05-16 10:10:38 +08:00   ❤️ 1
    因为更好的语义化和遵守规范吧,同理 http 状态码也是一样,1xx - 5xx 都有不同的含义。

    以 restful 举个简单的例子,把你要操作的对象当作资源:
    GET 方法获取这个资源,get /books/1 | get /books?page=1,200 表示成功找到
    POST 方法创建一个资源,post /books,201 表示成功创建
    PUT 方法更新一个资源,put /books/1,200 表示更新成功
    DELETE 方法表示删除一个资源,delete /books/1,删除成功,返回 204,不必返回内容

    此外还有 patch 部分更新资源等等方法,401 未授权等等状态码,分别表示不同的含义。

    这样在一个 URL 端点上就能完成资源的增改删查四种操作。

    个人理解就是既然规定了这么多,那就物尽其用呗。

    一般对外开放的 open api 会规范一些,比如 https://developer.github.com/v3/ ,对内的做得比较好的,参考 https://h5.ele.me

    但是,实际操作中往往还是按照团队的规定和喜好吧。
    我们有几个项目,所有 API 一律使用 POST 方法,语义就以 URL 来做,比如:
    post /get_books_info 查询资源
    post /add_book 创建资源
    ....
    返回状态码一律为 200, 靠 body 中的 err_code 来判断请求是否成功。

    当然,为了加密等需求,也有许多更奇怪的方案,比如我校 app,所有均为 get,请求体加密成字符串放到 url 中,公开产品比较著名的就是网易云音乐了 , 全为 post,body 是加密后的参数
    https://github.com/darknessomi/musicbox/wiki/%E7%BD%91%E6%98%93%E4%BA%91%E9%9F%B3%E4%B9%90%E6%96%B0%E7%89%88WebAPI%E5%88%86%E6%9E%90%E3%80%82

    两种方案各有优缺点,业务复杂的时候 restful 还是有点吃力的,不必完全去遵守哪一种。文档写的好,能让 api 的使用者明白、方便就行了(微信真是。。。。。

    最后,回到你这个问题,编写 web api 时候并不是每一种方法都要写,就如 4 楼所说,http 是有一个专门的状态码来表示不支持该请求方法的,405 Method Not Allowed。当客户端使用了不支持的方法来请求,就返回这个状态码好了。

    当然,如果有跨域等需求,像 options 这种方法还是要实现的,不过直接在 nginx 层做或者一般的 web 框架都有对应的实现,不必手动去写。
    Feedline
        20
    Feedline  
       2019-05-16 10:55:43 +08:00
    只要胆子大,你甚至可以使用本地文件数据库,每次正式访问前先选择本地文件数据库地址,这样服务器也无法获取到你的资料,全网数据隔离
    xfriday
        21
    xfriday  
       2019-05-16 15:23:39 +08:00
    先问是不是,再问为什么
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1000 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 20:00 · PVG 04:00 · LAX 13:00 · JFK 16:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.