V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
iOS 开发实用技术导航
NSHipster 中文版
http://nshipster.cn/
cocos2d 开源 2D 游戏引擎
http://www.cocos2d-iphone.org/
CocoaPods
http://cocoapods.org/
Google Analytics for Mobile 统计解决方案
http://code.google.com/mobile/analytics/
WWDC
https://developer.apple.com/wwdc/
Design Guides and Resources
https://developer.apple.com/design/
Transcripts of WWDC sessions
http://asciiwwdc.com
Cocoa with Love
http://cocoawithlove.com/
Cocoa Dev Central
http://cocoadevcentral.com/
NSHipster
http://nshipster.com/
Style Guides
Google Objective-C Style Guide
NYTimes Objective-C Style Guide
Useful Tools and Services
Charles Web Debugging Proxy
Smore
lookhi
V2EX  ›  iDev

API的设计困难 求协助 求指导

  •  
  •   lookhi · 2013-04-04 23:16:28 +08:00 · 4217 次点击
    这是一个创建于 4243 天前的主题,其中的信息可能已经有所发展或是发生改变。
    现在在设计我们有爱帖的网页快照API.
    共3个调用.
    1. 请求网页快照,这个简单
    2. 查询快照状态,因为快照需要时间。现在还不是立即就可以获取,因此增加这个查询步骤。
    3. 获取快照的数据,这样就可以把快照的数据保存到合适的地方或者放到其他网站上进行展示。

    问题出在第3个 获取快照的数据 上。
    现在是这样设计的
    调用:
    HTTP地址: https://www.youaitie.net/api/getsnapshot/
    请求方式: GET
    调用参数:
    token → 您的请求访问许可(access_token)。
    jobid → 提交快照请求时返回的jobid值

    但是返回数据结果有麻烦了。这里有2种情况。
    1) 提交的参数有问题,那么只能返回一个错误提示和错误原因回去。
    2) 提交的参数都正确,需要返回一个数据文件回去。

    这2种情况怎么来区分开来?分别返回什么样的结果给请求方,而且调用的请求方还能很方便的进行区分出这2种情况。
    15 条回复    1970-01-01 08:00:00 +08:00
    yexiaoxing
        1
    yexiaoxing  
       2013-04-05 01:26:52 +08:00   ❤️ 1
    统一用json,写一个resultid,请求方通过判断resultid来知道是否发生错误。
    allenwei
        2
    allenwei  
       2013-04-05 02:13:05 +08:00   ❤️ 1
    参数有问题就返回500或者其他状态码,在body里面写错误信息
    lookhi
        3
    lookhi  
    OP
       2013-04-05 09:14:49 +08:00
    @yexiaoxing json里面包含一个数据文件 膨胀太多了的
    @allenwei 是个好主意啊
    lookhi
        4
    lookhi  
    OP
       2013-04-05 10:44:28 +08:00
    刚刚在线更新API的文档,先文档后实现. http://www.youaitie.net/api.html
    是否说明清楚了啊?
    siteshen
        5
    siteshen  
       2013-04-05 11:46:26 +08:00
    为什么不用http自带的staus表示成功与否?
    参数错误:400,access_token不正确或过期:401?
    lookhi
        6
    lookhi  
    OP
       2013-04-05 13:13:35 +08:00
    @siteshen 也想过考虑这样更标准的status code.
    不过有些错误原因,status code里面是没有覆盖的。比如任务还未完成。
    用这40x系列的错误提示,用户还是需要去看body里面的内容。而且还需要针对不同的status code进行分类。
    当然还有个停重要的原因,40x系列的status code已经被http服务器这边重新定义到一个自定义的错误页面上。也不想造成同code不同显示的困扰。
    还有个问题,API说明清楚么 我对自己写的这个文档的表达水平很是担忧啊.
    sprhawk
        7
    sprhawk  
       2013-04-06 10:58:24 +08:00   ❤️ 1
    @lookhi 最方便的其实就是自己定义返回status code,你的接口是的错误返回应该和web请求的返回分离,如果真的出现40x错误,api请求也不应该直接跳转到web页面上。

    另外,我觉得你可以单独使用,但我还是建议你混合使用:通过你返回的content-type,你可以确定你的文档类型,如果是json,就调用json的处理方法(判断错误之类),如果是其他的类型(比如xml),那就当作是正确的返回,继续处理好了
    sivacohan
        8
    sivacohan  
       2013-04-06 14:44:24 +08:00 via Android   ❤️ 1
    我们的做法是不使用status code,理由是避免和服务器的问题产生混淆。
    用json,每一个json的格式为,errcode,errmsg,body,得到返回判断errcode是否为0,不然就log errmsg,然后进行相关处理
    lookhi
        9
    lookhi  
    OP
       2013-04-06 15:35:05 +08:00
    @sivacohan 这个是需要下载数据。数据文件可能有个十兆几十兆的,JSON里面包含这么大的一个数据集。可以吗?
    alexrezit
        10
    alexrezit  
       2013-04-06 15:47:34 +08:00 via iPad   ❤️ 1
    不一定所有东西都放在内容里面, status code 放在 header 里面才是适合你的方法.
    而且大数据应该和 API 分离, API 只返回一个数据文件的 URL, 需要数据文件时当作单纯的下载来处理.
    alexrezit
        11
    alexrezit  
       2013-04-06 15:51:45 +08:00 via iPad
    @sivacohan
    在 header 里面加一个临时 token 即可, 如果服务器出错没有返回正确的值直接抛弃掉. 据说还能顺便防范一下 CSRF 攻击.
    lookhi
        12
    lookhi  
    OP
       2013-04-06 16:13:55 +08:00
    @alexrezit 那用户还需要额外的一次数据请求吧。同样的这个额外的请求 依旧会遇到非法读取或者过期 未完成的问题吧.
    sivacohan
        13
    sivacohan  
       2013-04-06 16:20:10 +08:00
    @lookhi

    设计接口有一个我个人非常喜欢的原则,只返回正确的结果,不对就抛出异常。

    返回的URL应该做如下处理。

    1、检测资源合法性。
    2、生成有时间限制的临时性URL,防止URL被滥用
    alexrezit
        14
    alexrezit  
       2013-04-06 18:33:15 +08:00
    @lookhi
    那就跟这个 API 没关系了, 按你的思路把所有数据一次性全部拿到耦合度太高.
    lookhi
        15
    lookhi  
    OP
       2013-04-06 19:42:37 +08:00
    @sivacohan @alexrezit 刚去看了下百度的云存储API,发现也是这样的。
    下载一个a.torrent文件.

    下一个不存在的文件a.avi & Token错误
    curl -I "https://pcs.baidu.com/rest/2.0/pcs/file?method=download&access_token=3..2592000.1367840158.2856296-248413&path=%2Fapps%2F%E6%B5%8B%E8%AF%95%E5%BA%94%E7%94%A8%2Fa.avi"

    HTTP/1.1 401 Unauthorized
    内容为{"error_code":110,"error_msg":"Access token invalid or no longer valid","request_id":2789237462}

    下一个不存在的文件a.avi
    不存在的情况
    HTTP/1.1 404 Not Found
    内容{"error_code":31066,"error_msg":"file does not exist","request_id":1463975029}

    下载a.torrent
    正确的请求
    HTTP/1.1 200 OK
    直接返回数据
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2771 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 12:49 · PVG 20:49 · LAX 04:49 · JFK 07:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.