首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python 学习手册
Python Cookbook
Python 基础教程
Python Sites
PyPI - Python Package Index
http://www.simple-is-better.com/
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
V2EX  ›  Python

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

  •  
  •   Wallace007 · 10 天前 · 2753 次点击

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

    21 回复  |  直到 2019-05-16 15:23:39 +08:00
        1
    uhian   10 天前
    如果有一种请求你没写但是别人用了,你的程序会怎么样?
        2
    sunzongzheng   10 天前 via Android
    为了满足 curd ?
        3
    chinvo   10 天前 via iPhone
    因为不写就不能用
        4
    rbe   10 天前
    @uhian #1 405 Method Not Allowed
        5
    LokiSharp   10 天前 via iPhone
    直接映射数据库就不用写了
        6
    Trim21   10 天前 via Android
    你要不想提供也可以不写
        7
    a11214214   10 天前
    为了 rest 设计?
        8
    leonme   10 天前 via Android
    我估计那个类似什么 APIJSON 的老哥又要来推广了 2333
        9
    DOLLOR   10 天前
    只要胆子大,你甚至可以让前端用 JS 拼接 SQL 并提交,然后直接拿到数据库的结果 233
        10
    conn4575   10 天前 via Android
    不支持的操作就可以不写啊
        11
    lzj307077687   10 天前
    反正我只写一种
        12
    Yarnus   10 天前 via iPhone
    Restful
        13
    vincel   10 天前
    @DOLLOR 只要胆子大 你甚至可以让前端直接把数据存在 cookie 里面,后端在旁边喊 666 就行了 233
        14
    shuAS   10 天前
    只要胆子大,你甚至可以直接把后台 /服务器密码留在前端页面上,想要自己去写,多简单 233
        15
    annielong   10 天前
    有需要再加吧,
        16
    jiejiss   10 天前
    只要胆子大,你甚至可以把所有数据库的数据转成 JSON 嵌在页面里,让前端读取去做查询
        17
    airfling   10 天前
    也不是,spring data rest api 就是你定义好 domain 后,把那个 repository 继承下就有基础的 crud 方法了,但是往往实际你用起来需要加点逻辑,而不是简单的存储查询
        18
    CallMeHoney   10 天前
    可以用一些类似于 tastypie 的框架
        19
    zhengjian   10 天前   ♥ 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 框架都有对应的实现,不必手动去写。
        20
    Feedline   10 天前
    只要胆子大,你甚至可以使用本地文件数据库,每次正式访问前先选择本地文件数据库地址,这样服务器也无法获取到你的资料,全网数据隔离
        21
    xfriday   9 天前
    先问是不是,再问为什么
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2218 人在线   最高记录 5043   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 19ms · UTC 05:03 · PVG 13:03 · LAX 22:03 · JFK 01:03
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1