RESTful API 数据协商

RESTful API 是一种用于产生和修改资源的软件架构风格。它通过 HTTP 使用资源的唯一标识符来进行交互。然而,RESTful API 还需要进行一种协商机制,以便客户端能够获取服务器支持的格式,并且服务端有机会进行格式更改或版本管理。

什么是数据协商?

数据协商是在客户端和服务器之间进行的,用于确定响应的格式和内容。在 RESTful API 中,协商用于确定使用哪种表示方法。例如,HTTP API 可能支持多个类型的表示方法,例如 HTML、JSON 和 XML。在客户端和服务器之间协商代表响应的格式和内容是十分必要的。

客户端和服务端如何进行数据协商?

RESTful API 使用 HTTP 头部来代表表示要协商的内容。这些头部是 Accept 和 Content-Type。

Accept

Accept 头部用于指示客户端支持的媒体类型和优先级。HEADER Accept:application/json

若 Accept 头部的值没有给出权重(qvalue)参数,则默认权重值为 1。若给出,权重值越大表示越优先。

例如,下面的 Accept 头部指示客户端首选 JSON 和 XML,其中 JSON 的权重为 1,XML 的权重为 0.5:

------- ----------------------- ---------------------

如果服务器能够以请求的任何一种格式进行响应,那么它将根据 Accept 头部中的值来决定要使用哪种格式。

Content-Type

Content-Type 头部指示服务器响应的媒体类型。HEAD Content-Type:application/json

例如,如果客户端需要使用 JSON 格式的请求体,并附带相应的 Content-Type 头部:

---- ------ --------
------------- ----------------

- ------- ------ -

表明发送方发送的实体的数据格式和内容。Content-Type 可用于多种类型,不同的值代表不同的数据格式,如application/json, application/xml,application/x-www-form-urlencoded 等。

如果服务端在响应中发送的媒体类型与客户端指定的媒体类型不兼容,则可以使用 406 Not Acceptable 响应。

RESTful API 的数据协商实例

在实际的应用场景中,RESTful API 的数据协商机制会用到各种 HTTP 头部,下面举例说明使用 HTTP 头部让客户端和服务器进行数据协商。

GET 请求实例

以下是 GET 请求,客户端需要服务器返回一个以 JSON 格式表示的列表。如果服务器不能提供所需的格式,则返回包含 406 Not Acceptable 的错误响应。

--- ------ --------
------- ----------------

-------- --- --
------------- ----------------

----------------- ----------------

POST 请求实例

以下是 POST 请求,客户端需要向服务器发送一个使用 JSON 格式表示的用户信息。如果请求的格式不是 JSON,则返回包含 415 Unsupported Media Type 的错误响应。

---- ------ --------
------------- ----------------

-------- -------

HTTP/1.1 201 Created Location: /users/123 Content-Type: application/json

{"id": 123, "name": "John"}

406 Not Acceptable 响应

如果服务器无法提供客户端请求的格式,则返回 406 Not Acceptable 状态码。下面是一个示例:

--- ------ --------
------- ---------------

-------- --- --- ----------
------------- ----------

-- ------ ------- --- --------- ----- -----

415 Unsupported Media Type 响应

如果客户端在请求中使用了不支持的格式,则服务器应该返回 415 Unsupported Media Type 状态码。例如:

---- ------ --------
------------- ---------------

-------- --- ----------- ----- ----
------------- ----------

--- ----- ---- -- --- ----------

总结

数据协商是 RESTful API 中非常重要的一部分,客户端和服务器通过 HTTP 头部进行协商,以确定要使用的媒体类型和版本。合理使用数据协商可以增强 API 的灵活性和可扩展性。

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/64668411968c7c53b070ab1c


猜你喜欢

  • Vuex 的状态管理 ——Getter

    Vuex 是 Vue.js 应用程序开发的状态管理模式。它充分利用了 Vue.js 的模块化机制,将应用程序中的所有组件状态集中处理,简化了应用程序的复杂度。Vuex 最重要的特性之一就是它提供了一个...

    1 年前
  • Flexbox 模块优化实践:如何减少重排重绘

    在前端开发中,Flexbox 是一种非常常见的布局模型。然而,使用 Flexbox 进行布局时,存在一些常见的性能问题:重排和重绘。这些问题会导致页面卡顿和响应速度变慢。

    1 年前
  • Next.js 项目中的标签云实现方法

    标签云是一种常见的网站内容展示方式,可以方便用户快速浏览和筛选相关内容。在 Next.js 项目中,可以利用 React 的组件化思想和 CSS 的灵活性实现标签云的效果。

    1 年前
  • Redux 架构中的缓存管理

    在前端应用开发中,数据缓存通常是一个重要的话题。当我们需要管理复杂的数据结构以及大量的数据时,往往需要一种高效的数据缓存方案来保证应用的性能和稳定性。Redux 架构中提供了一种强大的数据流管理方式,...

    1 年前
  • Kubernetes 中 Service 对象的使用方法

    在 Kubernetes 中,Service 对象是一种非常重要的概念,它可以将 Pods 组织在一个虚拟的节点组中,提供了外部访问这些 Pods 的接口。本文将详细介绍 Kubernetes 中 S...

    1 年前
  • Node.js 中 Docker 的使用流程

    在前端开发中,Docker 已经成为了一个非常重要的工具。然而,很多人可能还不了解 Docker 在 Node.js 中的使用。本文将会详细介绍如何在 Node.js 中使用 Docker,并附上相应...

    1 年前
  • Headless CMS 中分页功能的实现方法

    Headless CMS 是一种把内容管理系统 (CMS) 从前端分离出来的架构模式,使得 CMS 可以被用于多种不同的前端展示,而无需改变 CMS 本身。在 Headless CMS 中,前端通过 ...

    1 年前
  • 自动化性能测试: 如何进行有效的负载测试

    在开发应用程序时,负载测试是非常关键的一环。通过模拟实际用户访问量,我们可以找出应用程序在高负载情况下的性能瓶颈。然而,手动进行负载测试非常耗时费力。因此,自动化负载测试就变得尤为重要。

    1 年前
  • 如何在 ECMAScript 2017 中正确使用箭头函数

    箭头函数是 ECMAScript 2015 引入的一种新的语法,它让函数表达式更加简洁并且易于阅读。在 ECMAScript 2017 中,箭头函数有了更多的特性和用法。

    1 年前
  • PWA 中应用 manifest.json 的制作与应用

    前言 作为一款新兴的 web 技术,PWA(渐进式 Web 应用)已经吸引了众多开发者的关注。它具有离线缓存、推送通知等功能,可以达到类似 Native App 的用户体验,增加用户粘度。

    1 年前
  • 如何在 Material Design 中使用 Toolbar 和 TabLayout 搭配制作顶部导航栏

    Material Design 是一个现代化的设计语言,被广泛应用于 Android 开发中。其中顶部导航栏是 Material Design 中最为常见的控件之一,同时也是用户最为关注的控件之一。

    1 年前
  • Mocha 测试框架中的持续集成

    前言 Mocha 是一款常用的 JavaScript 测试框架,可以帮助开发者有效地进行单元测试和集成测试。在日常开发中,我们经常需要对代码进行修改和更新,同时也需要保证对代码的修改不会对系统的正常运...

    1 年前
  • MongoDB 操作符详解

    MongoDB 是当下比较流行的 NoSQL 数据库,具有高性能、易扩展等特点,被广泛应用于 Web 开发、移动应用、物联网等领域。本文将对 MongoDB 中的操作符进行详细介绍,以帮助前端开发者更...

    1 年前
  • CSS Grid 中如何实现自适应单元格?

    CSS Grid 是一种新型的网格布局系统,它可以帮助我们快速并且灵活地实现多种页面布局。相较于传统的布局方法,CSS Grid 更加强大和易用。在本文中,我们将重点介绍如何在 CSS Grid 中实...

    1 年前
  • 使用 Cypress 进行 Express 应用测试的实践

    前言 在Web应用开发过程中,测试是不可或缺的一环。前端开发人员通常会使用诸如 Jasmine、Mocha、Karma 等工具进行单元测试、集成测试。而在进行端到端(End-to-End)测试时,我们...

    1 年前
  • babel-runtime 插件原理解析

    前言 在开发前端项目的过程中,我们常常会用到 ES6+ 的新特性,比如箭头函数、模板字符串、解构赋值等等。这些新特性让我们代码更加直观、简洁、易读。但是,由于不兼容性的问题,这些语法特性并不能直接在浏...

    1 年前
  • Jest 测试 React 组件,如何 mock i18n?

    前言 在编写 React 组件时,我们通常会使用 i18n 库来实现多语言支持。但是,在编写单元测试时如何处理 i18n 依赖呢?在这篇文章中,我们将介绍如何在 Jest 中模拟 i18n 依赖,并展...

    1 年前
  • Promise 中如何取消异步操作?

    在前端开发中,经常会用到异步操作来处理一些需要较长时间才能完成的任务。而 Promise 是 ES6 中的一个重要特性,可以更加方便地处理异步操作。但是,在某些情况下,我们可能需要取消正在进行的异步操...

    1 年前
  • 使用 GraphQL 和 MongoDB 构建完整的应用程序

    在现代 Web 开发中,数据一直是一个核心问题。开发者们需要使用各种工具和技术来存储、查询和处理数据。GraphQL 和 MongoDB 都是当前非常流行的技术,它们可以共同构建一个完整的应用程序。

    1 年前
  • 响应式设计中的鼠标悬浮效果

    鼠标悬浮效果是网页设计中的一种常见交互体验。在响应式设计中,鼠标悬浮效果也扮演着十分重要的角色。本文将详细介绍响应式设计中鼠标悬浮效果的实现方法以及其学习和指导意义。

    1 年前

相关推荐

    暂无文章