首页
学习
活动
专区
圈层
工具
发布

REST API 设计最佳实践:如何构建、设计和使用 API ?

但是,我也曾遇到过一些让 REST 蒙羞的 API 例子,错误使用 HTTP 状态码、纯文本响应、不一致的模式、插入端点中动词......特别关注 HTTP 状态码 这一点非常重要,如果你从这篇文章中只记住一件事,那可能就是它了。 你的API最糟糕的事情莫过于返回一个带有200 OK状态码的错误响应。...这是最差的语义,相反,应该返回一个能准确描述错误类型的有意义HTTP状态码。尽管如此,你可能还在想:“但我按照您推荐的方式,在响应体中发送了错误详细信息,那么问题出在哪里呢?” 让我给你讲个故事吧。...优雅地处理尾部斜杠 关于URI是否应该有尾随斜杠/实际上并不是一个值得争论的问题,你只需要选择其中一种方式(即带或不带尾随斜杠),坚持使用它,并在客户端使用错误约定时优雅地重定向。 讲个故事吧!...有一天,当我将REST API集成到我的一个项目中时,每次调用都收到HTTP 500内部错误。

2.2K40

如何使用SpringMvc处理Rest异常

但我们其实还可以增加更多信息,以提供一个又直观又很有帮助的错误描述。...甚至理论上严格来说,响应体放的是uri指向的资源,响应头放的是描述资源和本次请求--响应的元信息,而错误情况的描述文本恰好属于“本次请求--响应的元信息”或“资源的元数据”,所以把错误情况放在响应体里是错误的...而既然都已经通过响应头获取状态码了,又何必再去响应体里获取一遍?多此一举。 我认为在使用http客户端时,处理响应的流程如下:  要捕获住所使用的http客户端组件声明的所有异常。...对于那些有可能是中间结点返回的错误响应(常见的包括401、403、404、405、406、408、409、429、500、502、503、504)要特别注意,它们的响应体未必符合http接口文档里声明的格式...这样确保错误码永远会有值,客户端不需要检查它是否为null。这对API使用者更容易和优雅,能提高接受度。

1.7K00
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    异常要怎么抛?

    msg,如果是SeverErrorException我就全部返回"内部服务器错误"。...我,握了棵草,查看了几个人的代码之后,我发现,全部在乱用,被逼无奈之下,我让他们都改一下,然后每个人都问我一下,为什么不能用这个却要用那个,前面几个我还能耐心的给讲讲细节,后面我实在不耐烦了,最后,亮出了我的大招...其实,对于业务开发者,真正能使用到的就应该是只有对于客户端错误的检查自己手动抛出异常,其他的异常一律不需要关心,比如空指针异常,远程调用异常,数据库异常,你要相信,这些异常都会在框架层处理的很好。...如果不带e,就变成吞异常了。 最后,为什么500不能随便抛呢?...正常来说,很多大公司都会监控http返回码,如果是500是要告警的,发邮件发短信,半夜把程序员(你)叫起来去改问题的,有可能还会通报批评,很严重的!

    1.8K30

    RESTful API设计--指南

    亚马逊是如何有效地使用 api 进行通信的最佳例子。 在这篇文章中,我将讨论如何更好地设计 RESTful api 以避免常见错误。...用名词(nouns)而不是动词(verbs) 很多开发者都犯了这个错误。他们通常忘记了我们有 HTTP 方法来更好地描述 API,并最终使用 API url 中的动词。...例如,获取所有产品的 API 应该是: /products 而不是如下所示 /getAllProducts 到目前为止,我已经看到了一些常见的 URL 模式。...有些人喜欢保留带有复数名称的资源 URL,而另一些人喜欢保留单数。例如- /products /product 我喜欢保持它的复数,因为它避免了我们谈论的是获取单个资源还是集合的混淆。...,在这些例子中,人们返回带有错误消息的 URL,这告诉你更多关于错误消息的信息以及如何处理它。

    2.1K50

    13 个设计 REST API 的最佳实践

    不要返回纯文本 虽然返回 JSON 数据格式的数据不是 REST 架构规范强制限定的,但大多 REST API 都遵循这条准则。...但是,仅仅返回 JSON 数据格式的数据还是不够的,你还需要指定返回 body 的头部,比如 Content-Type,它的值必须指定为 application/json。...你可能知道,HTTP 中你可以返回带有 200 状态码的错误响应,但这是十分糟糕的。不要这么做,你应当返回与返回错误类型相一致的具有一定含义的状态码。...某天,我在将某个 API 端点集成到项目中,但是我总是收到 500 Internal Error 的错误,我调用的端点差不多看起来这样: POST: /entities ``` 调试一段时间之后...Python 开发者可能马上掏出了 Flask,而 JS 开发者也不甘示弱,祭出了 Express,他们会使用实现一些简单的 routes 来处理 HTTP 请求。

    4.3K20

    RESTful规范

    什么是RESTful 一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。...Response body提供 即:返回的信息中将error作为键名,出错信息作为键值即可 1)错误的代码(日志/问题追查); 2)错误的描述文本(展示给用户)。...异常的文本描述; 在Controller层使用统一的异常拦截器: 1.     设置 HTTP响应状态码:对业务类异常,用它指定的 HTTPcode;对非业务类异常,统一500; 2.     ...Response Body的错误描述:对业务类异常,用它指定的错误文本;对非业务类异常,线上可以统一文案如“服务器端错误,请稍后再试”,开发或测试环境中用异常的 stacktrace,服务器端提供该行为的开关...自己的代码不要抛这个异常 六、其他 (1)API的身份认证应该使用OAuth2.0框架 (2)服务器返回的数据格式,应该尽量使用JSON,避免使用XML (3)比较复杂的接口不能确定是使用POST还是

    2.5K00

    restful api接口规范和服务调用的区别_rest接口规范

    错误处理 不要发生了错误但给2xx响应,客户端可能会缓存成功的http请求; 正确设置http状态码,不要自定义; Response body 提供 1) 错误的代码(日志/问题追查);2) 错误的描述文本...业务类异常必须提供2种信息: 如果抛出该类异常,HTTP 响应状态码应该设成什么; 异常的文本描述; 在Controller层使用统一的异常拦截器: 设置 HTTP 响应状态码:对业务类异常,用它指定的...HTTP code;对非业务类异常,统一500; Response Body 的错误码:异常类名 Response Body 的错误描述:对业务类异常,用它指定的错误文本;对非业务类异常,线上可以统一文案如...自己的代码不要抛这个异常 8....URI失效 随着系统发展,总有一些API失效或者迁移,对失效的API,返回404 not found 或 410 gone;对迁移的API,返回 301 重定向。

    2.3K10

    RESTful架构API风格与相关规范 极客开发者

    实际上,在对计算机技术的理解中,一百个人可能会有一百种理解方式,尽管见仁见智,但我们的目的都是把技术当作工具,去实现我们的程序功能。如果在本文中的描述有所错误,或您有所不解,欢迎留言评论!...如“Content-Type: text/html”表示为html格式的文本数据,而“Content-Type: text/json”表示为JSON格式的文本数据。 1....下面是我总结的RESTful API的相关风格规范,今后我将使用此规范进行API开发。 1. 协议 客户端与服务器之间使用HTTP或者HTTPS协议进行通信。...limit=10&deleted=true # 获取数据库中已经标志为删除的10条信息集合 7.返回 使用相应的HTTP状态码,将结果告知客户端,以下是常用的HTTP状态码以及状态描述: 状态码 描述...,即超媒体,在返回结果中提供链接,连向其他API方法或者一些文档,使得用户不查文档,也知道下一步应该做什么。

    64710

    REST API有关幂等性等11条最佳实践

    在我的职业生涯中,我使用了数百个 REST API 并制作了数十个。由于我经常在 API 设计中看到相同的错误,因此我认为写下一组最佳实践可能会更好。...HTTP 404 表示 "未找到内容",这与返回 HTTP 500 几乎一样--它可能意味着内容不存在,也可能意味着出了问题;客户端无法确定是哪种情况。...当客户最终看到不一致的数据时,这可能是 "你的错",也可能不是,但他们给你打的支持电话将是真实的。 我的建议是选择另一种 400 级错误代码,客户可以将其理解为 "我知道你要什么,但我没有"。...有两个主要的思想流派: 1、返回错误 当客户端提交重复的幂等性密钥时,我喜欢返回 409 CONFLICT。...但是,它使服务器实现变得非常复杂:您需要将所有响应存储一段时间,并且需要验证客户端是否为每个请求发送了完全相同的参数。 Stripe选择了这条路线。

    1K20

    四问四答Java异常抛出和处理

    抛什么类型的异常 需要处理且使用者有能力处理的场景,抛Checked Exception。...", Stripe.getApiBase(), e.getMessage()), e); } } 该方法向stripe API发送请求,它抛出了一个...抛出的异常种类越多,使用者的理解、处理成本越高。因此,尽量使用已有异常,当需要抛业务相关的异常,才考虑自定义。 自定义异常注意事项 语义清晰、带有业务意义、保留原异常数据。...最好提供提供处理指引,像上面提到的stripe-java的request方法的错误描述。 原始Throwable类 引起该异常的源头。保留完整信息,便于使用者定位、排查问题。...使用者能够根据自身需要,选择什么场景重试,什么场景不重试,什么场景重试几次等等。 小结 在业务程序中抛出自定义异常时,我曾经想过只定义一个xxExcpetion,然后用错误码来代表不同的异常类型。

    76710

    JavaScript 实现 JSON 解析器

    好吧,别急,我的朋友,我们刚刚完成了理想的情况,那异常的情况呢? 处理意外的输入 作为一名优秀的开发人员,我们还需要优雅地处理异常情况。对于解析器,这意味着使用适当的错误消息对开发人员进行提醒。...,每当您遇到带有加密消息的语法错误时,您完全不知道出了什么问题吗?...有很多比大喊大叫来处理错误消息的更好的方法,您可以考虑将以下几点添加到解析器中: 错误代码和标准错误消息 这对于用户向 Google 寻求帮助作为标准关键字很有用。...像 Babel 这样的解析器,将向您显示一个代码框架,一个带有下划线、箭头或突出显示错误的代码片段: // instead of Unexpected token "a" at position 5...如果你喜欢你刚刚读到的,请在 Tweet 转发[10]并评论它,我会写更多相关的文章; 如果你不同意或对这篇文章有意见,也请在 Tweet 转发[11]并评论它,我可以采纳你的建议并改进它。

    4.1K30

    C++ CGIweb编程

    它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。请求和响应消息的头以ASCII形式给出;而消息内容则具有一个类似MIME的格式。...POST 从客户端向服务器发送数据,一般用于发送表单中填写的数据等情况下 HEAD 和GET基本相同,不过它只返回HTTP的消息头(message header)的内容,而不是数据的内容。...206 Partial Content 客户发送了一个带有Range头的GET请求,服务器完成了它。 3xx:重定向 消息 描述 300 Multiple Choices 多重选择。链接列表。...423 锁定的错误。 5xx:服务器错误 消息 描述 500 Internal Server Error 请求未完成。服务器遇到不可预知的情况。...这是我的第一个 CGI 程序 2.2.2 C++ CGI库 在真实的实例中,您需要通过 CGI 程序执行许多操作。

    1.8K20

    深入理解什么是RESTful API ?

    它可以是一段文本、一张图片、一首歌曲、一种服务,总之就是一个具体的实在。你可以用一个URI(统一资源定位符)指向它,每种资源对应一个特定的URI。...URI只代表资源的实体,不代表它的形式。严格地说,有些网址最后的".html"后缀名是不必要的,因为这个后缀名表示格式,属于"表现层"范畴,而URI应该只代表"资源"的位置。...它的具体表现形式,应该在HTTP请求的头信息中用Accept和Content-Type字段指定,这两个字段才是对"表现层"的描述。...比如网上汇款,从账户1向账户2汇款500元,错误的URI是: POST /accounts/1/transfer/500/to/2 正确的写法是把动词transfer改成名词transaction,资源不能是动词...API RESTful API最好做到Hypermedia,即返回结果中提供链接,连向其他API方法,使得用户不查文档,也知道下一步应该做什么。

    3.6K20

    深入理解什么是RESTful API ?

    它可以是一段文本、一张图片、一首歌曲、一种服务,总之就是一个具体的实在。你可以用一个URI(统一资源定位符)指向它,每种资源对应一个特定的URI。...它的具体表现形式,应该在HTTP请求的头信息中用Accept和Content-Type字段指定,这两个字段才是对"表现层"的描述。...比如网上汇款,从账户1向账户2汇款500元,错误的URI是: POST /accounts/1/transfer/500/to/2 正确的写法是把动词transfer改成名词transaction,资源不能是动词...500 INTERNAL SERVER ERROR - [*]:服务器发生错误,用户将无法判断发出的请求是否成功。 状态码的完全列表参见这里。...API RESTful API最好做到Hypermedia,即返回结果中提供链接,连向其他API方法,使得用户不查文档,也知道下一步应该做什么。

    1.1K20

    云达作业,常见错误

    POST方法: 第二种情况: 前端参数类型与后台数据库中的存储类型不一致导致错误: 这种情况(1)如果只需从前台获取则只需要将前台参数名避免与数据库中参数名一致 (2)如果只需传递参数,则可以用指定类型接收以后...telNew 定义用于输入电话号码的字段。 text 默认。定义一个单行的文本字段(默认宽度为 20 个字符)。 timeNew 定义用于输入时间的控件(不带时区)。...也就是说可以是任意的类型,接口定义 interface 既然是接口 它的实现都可以执行SnatchResult来实现接口 声明了T 那就可以在实现时 按需用不同的类型定义 比如说通过它的接口实现的类...):http://doc.ruoyi.vip/ruoyi/document/qdsc.html#列的各项 id和name的区别 HTML文本是由HTML命令组成的描述性文本,HTML命令可以说明文字、...HTML的结构包括头部(Head)、主体(Body)两大部分,其中头部描述浏览器所需的信息,而主体则包含所要说明的具体内容。

    94410

    flask 应用程序编程接口(API)最后一节

    当一个API需要返回一个错误时,它需要是一个“机器友好”的错误类型,踩客户端可以轻松解释这些错误。因此,我同样设计错误的表示为一个JSON。...我在错误表示中使用这些名称作为error数组的值,所以我只需要操心数字状态码和可选的长描述。...对象查询的get_or_404()方法的英文以前见过的get()方法的一个非常有用的变行业释义体育,如果用户存在,报道查看它定给id的对象,当ID不存在时,它会中止请求并向客户端返回一个404错误,而不是返回...如果其中任何一个缺失,那么我使用应用程序/ API / errors.py模块中,bad_request()辅助函数向客户端返回一个错误。...API中没有HTML或登录页面的概念,如果客户端发送带有无效或所有权凭证的请求,服务器必须拒绝请求并返回401状态码。

    6.2K10

    HTTP协议详解以及URL具体访问过程

    它规定了计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或规则,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器。   简单的来说,它就是基于应用层一个规范一个标准!...答:因为我看书看博客资料都遇到过着两个名词,第一次遇到是在学习API的时候,那时候我是一脸懵逼,不是怎么区分,感觉看过去都是一串网址呀!事实并非如此。...6.2、响应行   响应数据的第一行,响应结果的概述。  状态码:   状态代码有3位数字组成,状态描述给出了状态代码简短的描述。...8、Content-Range:用于指定整个实体中的一部分的插入位置,他也指示了整个实体的长度。在服务器向客户返回一个部分响应,它必须描述响应覆盖的范围和整个实体长度。...局部DNS服务器不是自己向其他DNS服务器进行查询,而是把能解析该域名的其他DNS服务器的IP地址返回给客户端DNS程序,客户端DNS程序再继续向这些DNS服务器进行查询,直到得到查询结果为止。

    3.2K40

    带你认识 flask ajax 异步请求

    当提供翻译链接并且用户点击它时,我需要将Ajax请求发送到服务器,服务器将联系第三方翻译API。一旦服务器发送了带有翻译文本的响应,客户端JavaScript代码将动态地将该文本插入到页面中。...它首先检查配置中是否存在翻译服务的Key,如果不存在,则会返回错误。错误也是一个字符串,所以从外部看,这将看起来像翻译文本。这可确保在出现错误时用户将看到有意义的错误消息。...requests.get()方法返回一个响应对象,它包含了服务提供的所有细节。我首先需要检查和确认状态码是200,这是成功请求的代码。...如果我得到任何其他代码,我就知道发生了错误,所以在这种情况下,我返回一个错误字符串。...为了获得文本,我需要找到包含用户动态正文的DOM内的节点并获取它的内容。为了便于识别包含用户动态的DOM节点,我将为它们附加一个唯一的ID。

    5.3K20

    如何创建一个自定义的`ErrorHandlerMiddleware`方法

    在本文中,我将讲解如何通过自定义ExceptionHandlerMiddleware,以便在中间件管道中发生错误时创建自定义响应,而不是提供一个“重新执行”管道的路径。...这没有听起来那么糟糕:即使没有异常处理中间件,ASP.NET Core也会在其底层架构中捕获该异常,将其记录下来,并向客户端返回一个空白的500响应: ?...对于Web API客户端来说,这实际上还不错。您的API使用者应能够处理错误响应,因此最终用户将不会看到上面的“中断”页面。但是,它通常不是那么简单。...总结 在这篇文章中,我描述了Razor Pages和Web API的默认异常处理中间件方法。...我着重指出了默认Web API模板配置的问题,尤其是在客户端期望有效JSON的情况下,即使出现错误也是如此。

    3K10

    HTTP 状态码

    500~505 服务器错误 当前的 HTTP 版本只为每类状态定义了几个代码。...可以根据其所处的范围,将它作为那个类别中一个普通的成员来处理 例如,若收到了状态码 515(在 5XX 代码的已定义范围之外),就应该认为这条响应指出了服务器的错误,这是 5XX 报文的通用类别 100...返回时会带有一个选项列表,用户可以选择期望使用的那项 301 Moved Permanently 在请求的 URL 已被移除时使用。...只有少量错误,比如404,还是会穿过浏览器来到用户面前 状态码 原因短语 含义 400 Bad Request 用于告知客户端它发送了一个错误的请求 401 Unauthorized 与适当的首部一同返回...代理会发布 5XX 服务器错误状态码来描述所遇到的问题 状态码 原因短语 含义 500 Internal Server Error 服务器遇到一个妨碍它为请求提供服务的错误时,使用此状态码 501 Not

    3.3K01
    领券