在 REST API 中,什么时候我应该使用信封?如果我在一个地方使用它,我应该一直使用它吗?

2023-12-27

我正在致力于构建 RESTful Web 服务。我已经尽可能地阅读了每种机制使用 HTTP 的原理,并且大多数时候,比如在获取资源时,它都工作得很好。

但是,当我需要发布某种新条目时,为了清晰和稳健,无论客户端可能做什么,我都想提供新条目可能失败的特定验证错误。此外,还存在一些特定错误,例如,用于创建新用户的数据完全有效,但可能会使用昵称或电子邮件地址。简单返回409 Conflict没有足够详细地说明哪个昵称或电子邮件地址被盗用了。

因此,解决这个问题并不是火箭科学:记录一堆特定的错误代码并返回一个有错误的对象:

{ errors: [4, 8, 42] }

这意味着,在请求不成功的情况下,我不会像 REST 哲学所期望的那样返回资源或其密钥。同样,当我返回许多资源时,我必须以某种方式将它们放入数组中。

所以我的问题是:如果我标准化一个信封以用于每个请求,那么我是否仍然可以提供行为良好的 RESTful Web 服务,例如,总是有一个像这样的对象{ errors, isSuccessful, content }?

我之前曾使用它构建过 RPC 风格的 Web 服务,但我不想制作“几乎 REST”的东西。如果休息有什么意义的话,我希望表现得尽可能好。

如果答案是“绝对不”(我认为可能是这样),我想听听它是否至少正确地解决了验证问题,以及解决此类问题的一个很好的参考可能是什么,因为大多数指南我'我们发现只详细介绍了简单的情况。


是的,信封是个好主意!总是有一些额外的信息需要从某些端点发送。例如分页、errorMessages、debugMessages。 Facebook 的做法示例:

Response from get friends request

{
  "data": [
    {
      "id": "68370", 
      "name": "Magnus"
    }, 
    {
      "id": "726497", 
      "name": "Leon"
    }, 
    {
      "id": "57034", 
      "name": "Gonçalo"
    }
  ], 
  "paging": {
    "next": "https://graph.facebook.com/v2.1/723783051/friends?fields=id,name&limit=5000&offset=5000&__after_id=enc_AeyGEGXHV9pJmWq2OQeWtQ2ImrJmkezZrs6z1WXXdz14Rhr2nstGCSLs0e5ErhDbJyQ"
  }, 
  "summary": {
    "total_count": 200
  }
}

在这里,我们使用下一个链接进行分页,以请求获取下一个用户块,以及可以获取的朋友总数的摘要。然而,他们并不总是发送这个信封,有时数据可以直接进入正文的根部。始终以相同的方式发送数据使客户端更容易解析数据,因为它们可以对所有端点执行相同的操作。客户端如何处理信封响应的一个小示例:

public class Response<T> {
  public T data;
  public Paging paging;
  public Summary summary;
}

public class Paging {
  public String next;
}

public class Summary {
  public int totalCount;
}

public class WebRequest {
  public Response<List<User>> getFriends() {
    String json = FacebookApi.getFriends();
    Response<List<User>> response = Parser.parse(json);
    return response;
  }
}

然后,只需将 List 更改为端点返回的数据,即可将该 Response 对象用于所有端点。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 REST API 中,什么时候我应该使用信封?如果我在一个地方使用它,我应该一直使用它吗? 的相关文章

  • Spring Boot 自定义 ErrorAttributes http 状态未设置为响应

    继Spring Boot之后文档 http docs spring io spring boot docs current reference htmlsingle boot features error handling我定义了自己的 E
  • 如何保护 RESTful Web 服务的安全?

    我必须实施安全RESTful Web 服务 https www ibm com developerworks webservices library ws restful 我已经使用谷歌做了一些研究 但我陷入困境 Options TLS H
  • REST URL 结构建议

    我正在尝试为我正在开发的网站的愿望清单部分敲定一个宁静的网址结构 这是一个非常简单的模型 用户可以有许多愿望清单 每个愿望清单可以包含许多产品 目前我有明显的 CRUD URL 来操作愿望清单本身 GET account wishlists
  • 如何在 Delphi REST 中发布内容类型为“multipart/form-data”的数据?

    我正在尝试使用 REST API 发送请求multipart form data作为内容类型 我总是收到 HTTP 1 1 500 Internal Error 作为响应 我尝试向需要的方法发送请求application x www for
  • 如何在没有可用行选择器的情况下为 APEX 21.1 REST 数据源设置数据配置文件

    我正在使用 APEX 21 1 并为 Web 服务创建了一个 REST 数据源 该服务以以下格式返回响应 1499040000000 A time stamp 0 01634790 A value etc 1499040000100 A t
  • 在 Hyperledger Composer REST API 上使用 Passport-http

    我想知道是否可以使用passport http来保护由composer rest server生成的Hyperledger Composer的REST API 以及什么是导出 COMPOSER PROVIDERS 配置 这个想法是使用先前生
  • 如何将 REST API 与 FireMonkey 结合使用?

    我需要在 FireMonkey 中实现 REST API 来获取一些信息 但我不确定如何做到这一点 REST API使用OAuth2 我可以访问两个代码 Consumer Key和Consumer Secret 之后 我需要获得一个临时的
  • 来自复杂对象的 spring RestTemplate POST 参数

    我正在尝试使用 postForObject 方法使用restTemplate 来测试我们的REST 服务 单元测试 Test public void testPostOrder String url BASE URL orders Orde
  • 如何触发应用程序通过 REST 服务获取数据?

    我正在寻找一种方法来触发应用程序从远程 REST 服务获取数据 该方法不需要轮询 iOS 推送通知似乎不是一个选项 因为它可以被用户停用 然而 我可能是错的 是否有最佳实践来完成此任务 实际上 推送通知是可行的方法 在 ios8 及更高版本
  • 如何在没有 baseUrl 的情况下设置 Retrofit

    我的 apiPath 是完全动态的 我有包含 ipAddress 和 SSLprotocol 等字段的项目 基于它们我可以构建我的网址 private String urlBuilder Server server String proto
  • 为什么“FormDataMultiPart”类型参数被区别对待

    我正在编写一个小网络应用程序 将文件上传到网络服务器 我一切正常 但令我感到困惑的是 几乎所有从客户端 浏览器 发送的参数都必须在服务器端注入单词 FormDataParam except FormDataMultiPart类型参数 有人可
  • 外部依赖错误的 HTTP 状态代码

    当服务器与外部 API 通信出现问题时 返回的正确 HTTP 状态代码是什么 假设客户端向我的服务器 A 发送有效请求 然后 A 查询服务器 B 的 API 以便执行某些操作 然而 B 的 API 当前抛出 500 错误或因某种原因无法访问
  • 获取/发布到 RESTful Web 服务

    我需要从 VB6 对 RESTful Web 服务进行一些 GET 和 POST 操作 最好和最简单的方法是什么 您需要添加对 MSXML 库的引用 Dim sUrl As String Dim response As String Dim
  • 如何获取数组作为 GraphQL 解析器的输入

    我想得到一个字符串数组ids查询变量中的参数并在我的解析器中使用它 下面是我的代码 People resolver ts import Resolver Query Mutation Args from nestjs graphql imp
  • Spring @RequestMapping 带有可选参数

    我的控制器在请求映射中存在可选参数的问题 请查看下面的控制器 GetMapping produces MediaType APPLICATION JSON VALUE public ResponseEntity
  • 在服务器内部调用 Web 服务

    我有一个网络服务 getEmployee 当传递 id 时 它会获取单个员工的员工详细信息 同一服务器上的另一个 Web 服务 getEmployeeList 当传递一个部门时 它会获取整个员工列表 这将获取部门的 ID 然后调用 getE
  • 该Web容器尚未启动@Glassfish 4.0.01 web

    所以 这就是我对我的服务进行 REST 调用后得到的结果 2014 04 25T01 06 52 393 0200 glassfish 4 0 WARNING javax enterprise web tid ThreadID 21 Thr
  • 使用Retrofit来消费服务器发送的事件

    我正在尝试使用rest api 1 https mesosphere github io marathon docs rest api html get v2 events将服务器发送的事件发送到客户端 我目前正在使用 square 的改造
  • 使用 CouchDB 提供 HTML 服务

    我正在尝试将 CouchDB 与 HTML 独立 REST 架构一起使用 也就是说 除了 CouchDB 和 ajax 风格的 javascript 调用 CouchDB 之外 没有其他应用程序服务器 看起来交叉脚本是一个问题 我之前使用过
  • 凭证过期错误/异常的 HTTP 状态代码应该是什么?

    我正在开发 RESTful API 我已经实现了基于令牌的身份验证 其中令牌摘要是使用时间戳准备的 现在 当请求到达 API 服务器时 我正在检查提供的时间戳是否无效 即指定了未来 过去的日期时间 然后抛出错误消息 指示 检测到未来令牌 或

随机推荐