一个restful api可以返回一个页面作为响应吗?
Posted
技术标签:
【中文标题】一个restful api可以返回一个页面作为响应吗?【英文标题】:Can a restful api return a page as a response? 【发布时间】:2020-01-02 00:41:45 【问题描述】:我了解 api 是一个应用程序编程接口,这意味着它是两个或多个程序或应用程序之间的接口,它允许通过请求和响应在它们之间进行通信。
通常当人们说 api 时,他们会想到第三方 api,例如获取天气或货币兑换的 API,这些 API 通常会以 JSON 或 XML 格式返回数据,等等。但是,如果我错了,请纠正我,但是客户端或前端如何与服务器或后端交互也被视为 api 对吗?例如,当我在我的 web 应用程序上提交表单作为获取请求时,url 将更改添加参数,基本上我的 web 应用程序或服务器的 api 将处理特定的 url 或 api 端点,并将返回一个响应,如渲染网页或返回看法。
我的问题是,我对此的理解是否正确,如果我的 Web 应用程序的前端和后端之间的这种交互方式被认为是一个 api,并且假设它符合 RESTful 约束,它是否被认为是宁静的,尽管它不'不要像 JSON 那样返回原始数据,而是使用 html css javascript 作为响应来呈现网页?或者它只是一个 RESTful api,如果它符合约束并且只返回原始 JSON 或与大多数外部使用的第三方 API 类似的数据格式?
【问题讨论】:
【参考方案1】:API 是一个糟糕的术语——我认为它在这里引起了一些混乱。
首先要直接 - 是的,restful api 可以“返回页面”作为响应 - 但您误解了网页是如何呈现的。
Web 浏览器“呈现”网页。当您输入https://youtube.com
时,它们从网络服务器收到的只是文本/html 格式的数据,然后由浏览器以它喜欢的任何方式进行解释/使其看起来更漂亮。实际上,通过 http 请求发送 text/html 文件或 json 文件并没有太大区别——“原始”数据一词在这里没有任何意义——所有数据在传输过程中都是原始数据。
【讨论】:
所以我对 API 的理解是正确的,尽管您的网页前端如何通过 url 端点与您的后端交互被认为是一个 API,对吗?我明白你在 express/node 中的意思我只想说渲染这个 html 页面,但你所说的基本上是发送到客户端的只是 html 和文本,客户端决定如何用 css 显示它和东西?但是 css 和 js 仍然由服务器发送到客户端,不是吗?但是就像它在客户端用 html/text 处理是你的意思吗? 这在技术上是正确的,是的,尽管它是 Web API 而不是常规 API。 Web API 定义了“端点”或“URI”,当在该“端点”上发出请求时,它们指向服务器发送的内容。有一个语义混淆点 - express 中有一个函数字面称为“渲染”,但它真正将数据发送到客户端 - 客户端的网络浏览器执行实际的“渲染”。你是对的,css和js是同时发送的(实际上)。 但是为什么所谓的 web api 不会像“常规”或第三方 api 用于获取天气数据或 JSON 中没有的东西也使用相同的方式来处理某些请求具有某些查询参数的端点并发送回响应。这两者之间的主要区别在于,Web api 类似于一种专门用于显示该应用程序的可视数据的内部 api,而常规 api 则以通常由它们处理的其他应用程序使用的格式响应 JSON 数据并为其应用程序进行所有处理和可视化。 就像你说的,即使是“渲染”一个页面实际上只是将 html 数据和静态文件发送到客户端,然后他们将其渲染并显示在那里,那么为什么这称为 web api?仅仅是因为用例吗?【参考方案2】:REST 是塑造万维网的架构约束的集合。
从某种意义上说,REST 的原始形式是返回带有 CSS 和 javascript 链接的 HTML。
Stefan Tilkov 的2014 talk 涵盖了资源的 HTML 表示的一些优点。另见Jon Moore 2010。
【讨论】:
好的,这有点清楚了。令人困惑的是,大多数人在提到一个宁静的 api 时,他们通常谈论的是那些外部 api,如 Facebook twitter 或一些返回 JSON 的天气 api,但使用你所说的,这意味着我在我的网络应用程序中使用的 API 来处理请求从我的前端到我的后端到 url 端点,在这种情况下返回响应 HTML 如果我使用的是 http 和某些约束,比如每个事务都是相同的,那么也可以将其视为 RESTful以上是关于一个restful api可以返回一个页面作为响应吗?的主要内容,如果未能解决你的问题,请参考以下文章
REST API 响应状态代码 - 搜索返回单个结果的 GET