Http相关

Q:RESTful接口风格是什么?

RESTful API 是一种基于 REST(Representational State Transfer,表现层状态转移)架构风格的 API 设计规范,它的核心思想是资源(Resource)和 HTTP 方法(Method)构成的组合来实现对资源的操作。

具体来说,RESTful API 通过 HTTP 方法来对资源进行操作,通常使用以下 4 种 HTTP 方法:

  • GET:获取资源

  • POST:创建资源

  • PUT:更新资源

  • DELETE:删除资源

同时,RESTful API 还应该满足以下几点要求:

  • 每个资源都有一个唯一的标识符(URI)来表示资源的位置

  • 所有的操作都是无状态的,也就是不依赖于之前的操作状态

  • 数据的表示应该使用标准的数据格式,如 JSON 或 XML

  • 安全性方面需要考虑如身份认证和访问授权等问题

通过遵循 RESTful API 的设计规范,可以使 API 的设计更加合理、清晰,并且易于维护和扩展。

Q:能给一些restful设计规范的接口demo看看吗?

当然,以下是一些常见的 RESTful API 接口规范:

  • 获取资源列表:GET /resources

  • 获取指定 ID 资源:GET /resources/:id

  • 创建资源:POST /resources

  • 更新指定 ID 资源:PUT /resources/:id

  • 删除指定 ID 资源:DELETE /resources/:id

其中 :id 表示 URL 参数,可以是任意字符串。另外,请求和响应的数据格式通常使用 JSON,具体如下:

  1. 获取资源列表
  • 请求方式:GET

  • 请求 URL:/resources

  • 请求参数:无

  • 响应状态码:

  • 200 OK - 成功获取资源列表

  • 404 Not Found - 未找到资源列表

  • 响应数据格式:

{"data": [{"id": 1,"name": "Resource 1","description": "Description 1"},{"id": 2,"name": "Resource 2","description": "Description 2"}]
}
  1. 获取指定 ID 资源
  • 请求方式:GET

  • 请求 URL:/resources/:id

  • 请求参数:无

  • 响应状态码:

  • 200 OK - 成功获取指定 ID 资源

  • 404 Not Found - 未找到指定 ID 资源

  • 响应数据格式:

{"data": {"id": 1,"name": "Resource 1","description": "Description 1"}
}
  1. 创建资源
  • 请求方式:POST

  • 请求 URL:/resources

  • 请求参数:

{"name": "Resource 3","description": "Description 3"
}
  • 响应状态码:

  • 201 Created - 成功创建资源

  • 400 Bad Request - 请求参数错误

  • 响应数据格式:

{"data": {"id": 3,"name": "Resource 3","description": "Description 3"}
}

Q:除了restful的设计规范,还有什么别的规范。他们比较一下有什么优劣?

除了 RESTful 设计规范之外,还有一些其他的设计规范,例如 SOAP、GraphQL、gRPC 等。这些规范都有其优缺点,适用于不同的场景和需求。

SOAP 是一种基于 XML 的通信协议,它使用了一些标准的协议,如 HTTP、SMTP、TCP、UDP 等,用于在 Web 上进行数据交换。它通过 WSDL(Web Services Description Language)来描述 Web 服务接口,因此具有较强的规范性和可扩展性。SOAP 对于安全性和事务处理的支持较好,但其缺点是过于冗长和繁琐,不易阅读和编写。

GraphQL 是 Facebook 开源的一种数据查询语言和 API 设计规范,它可以让客户端查询需要的数据而不会浪费网络带宽和服务器资源。GraphQL 的优点是可以在一次请求中获取多个数据,避免了 RESTful 接口中多次请求数据的问题。GraphQL 还支持多版本和类型检查等功能。但是,GraphQL 适用于较为复杂的场景,对于简单的数据查询,使用 RESTful 接口可能更为方便。

gRPC 是 Google 开源的一种高性能、跨语言的远程过程调用(RPC)框架,它使用了 Protobuf 作为序列化和反序列化的协议。gRPC 的优点是高性能、跨语言支持、自动生成代码等。但是,它的缺点是比较复杂,需要进行额外的学习和使用。

综上所述,不同的规范适用于不同的场景和需求。在选择时需要根据实际情况进行综合考虑。

Q:GraphQL能详细描述一下吗,需要给一点demo。

GraphQL是一种由Facebook开发的查询语言和运行时环境,用于构建API,并提供强类型、可扩展和可文档化的数据查询接口。

与RESTful API相比,GraphQL的主要优势是:

  1. 更少的网络请求:GraphQL支持客户端一次性请求多个资源,而不是像RESTful API那样需要多个请求。

  2. 精确获取数据:GraphQL允许客户端精确指定需要获取的数据,而不是像RESTful API那样需要获取整个资源的所有数据。

  3. 强类型定义:GraphQL使用类型定义来描述API中的数据模型,可以避免许多类型错误和错误处理问题。

下面是一个简单的GraphQL查询示例:

query {user(id: 123) {nameemailposts(limit: 10) {titlecontent}}
}

这个查询请求将返回id为123的用户的姓名、电子邮件和最近10篇帖子的标题和内容。

可以看到,GraphQL的查询语言相对于RESTful API的HTTP请求更加精细和高效。但是,在使用GraphQL时需要花费更多的精力来规划和设计API架构,因此在小型项目或小型API中使用可能会过度复杂化。

Q:GraphQL到底是一种设计规范,还是一种语言?

GraphQL 既是一种设计规范,也是一种查询语言。

作为一种设计规范,GraphQL 定义了一组基本概念和规则,以便客户端和服务器之间能够定义和执行对于数据的查询和变更操作。这些基本概念包括:对象类型(Object Types)、字段(Fields)、参数(Arguments)以及查询(Query)、变更(Mutation)和订阅(Subscription)等操作类型。

作为一种查询语言,GraphQL 可以让客户端定义它们需要的数据,而不需要预定义复杂的多个接口或者对已有的 RESTful API 进行重构。通过发送一个 GraphQL 查询,客户端可以获取精确的需要的数据,避免了浪费带宽和资源的问题。

下面是一个 GraphQL 查询的例子:

query {movie(id: 1) {titledirectorreleaseDateactors {nameage}}
}

在这个例子中,我们查询了一个名为 “movie” 的对象,指定了 id 参数为 1,并要求返回电影的标题、导演、发行日期以及演员的姓名和年龄等信息。根据这个查询,服务端可以返回一个包含所有请求数据的 JSON 对象。

Q:客户端用graphql的话,后端接口要跟着一起做改造吗?

是的,如果客户端希望使用 GraphQL 来获取数据,后端接口需要提供支持 GraphQL 的 API。这意味着后端需要编写相应的 GraphQL schema,并实现相关的 resolver 函数来获取和处理数据。如果后端原先是基于 RESTful 接口实现的,那么需要对原有接口做一定的改造,以符合 GraphQL 的要求。

GraphQL 的请求和响应格式与传统的 RESTful 接口有很大的不同。RESTful 接口通常会返回整个资源的完整信息,而 GraphQL 的请求可以精确指定需要返回的字段,避免了资源浪费。因此,如果后端想要提供 GraphQL 支持,需要重新设计 API 的返回格式,以支持 GraphQL 的请求和响应格式。

总之,使用 GraphQL 需要后端和前端共同配合,后端需要提供支持 GraphQL 的接口,前端需要使用相应的客户端库来发起 GraphQL 请求,并处理返回结果。

Q:用graphql发出的请求,可以在浏览器控制台里看到接口信息吗?

可以。在浏览器控制台的 Network 标签页中,可以看到 GraphQL 请求的信息,包括请求的 URL、请求方法、请求头、请求体等。同时,也可以查看响应的信息,包括响应状态码、响应头、响应体等。在响应体中,可以看到 GraphQL 返回的数据,以及对应的字段和类型信息。

Q:用iframe来加载一些第三方的落地页时候,经常会出现iframe加载不成功落地页的情景。什么原因?有解吗?

看控制台的报错应该可以看到,是由于第三方页面在响应头(response header)里设置了Content-Security-Policy(简称CSP)引起的。那么什么是CSP呢?

Content-Security-Policy

HTTP 响应头 Content-Security-Policy 允许站点管理者控制用户代理能够为指定的页面加载哪些资源。除了少数例外情况,设置的政策主要涉及指定服务器的源和脚本结束点。这将帮助防止跨站脚本攻击(Cross-Site Script)(XSS (en-US))。

reference:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Content-Security-Policy

也就是说第三方网页为了防止自己被别人加载了自己的网页,可以设置用户加载时候是否跟当前地址是一个主域名等规则限制。设置规则例如可以有:

  • default-src:为其他取指令提供备用服务 fetch directives。

  • connect-src:限制能通过脚本接口加载的 URL。

    ……

    等等规则。

那么,有解吗?基本是无解的,不要想着强行绕过去了。

Q:有这样一个场景,在iframe中加载一个第三方网站,但是因为这个网站有鉴权,会被重定向去登录页,但是登录完成后还是会重定向回到登录页,什么情况?

因为登录完后一般会由服务端种植cookie,但是set-cookie有一个默认属性SameSite=Lax。

Lax: 这意味着 cookie 不会在跨站请求中被发送,如:加载图像或 frame 的请求。但 cookie 在用户从外部站点导航到源站时,cookie 也将被发送(例如,跟随一个链接)。这是 SameSite 属性未被设置时的默认行为。

这也就是说,因为iframe加载的页面和当前网站存在跨站行为,所以登录的cookie不会被携带。那么如何解决呢?

可以通过chrome插件的方式来修改cookie的SameSite属性,将其设置为None。因为Chrome浏览器插件不受跨站跨域的限制,所以对于本地调试的场景,可以通过安装相关cookie透传的插件来解决。

在设置这一属性值时,必须同时设置 Secure 属性,就像这样:SameSite=None; Secure

备注: 与 SameSite Cookie 相关的标准作了如下变动:

  1. SameSite 属性未被指定时,其默认行为是 SameSite=Lax。在过去,若未指定,所有的 cookie 均会被发送。

  2. 现在,携带 SameSite=None 属性的 cookie 必须同时设置 Secure 属性(换句话说,其仅能用于安全上下文)

  3. 来自同一域的 cookie 若使用了不同的协议(http: 或 HTTPS:),将不再被视为来自同一站点。

参见浏览器兼容性表以了解不同浏览器的实线情况(行:“SameSite: Defaults to Lax”、“SameSite: Secure context required”和“SameSite: URL scheme-aware (“schemeful”)”)。

Q:强缓存(Expires、Cache-Control)和协商缓存(Last-Modified、ETag)的区别

强缓存优先级:Cache-Control > Expires。Expires的格式是一个日期(例如Sat, 11 Jul 2020 06:26:27 GMT),这容易被本地时间影响,造成缓存冲突。Cache-Control的格式是:max-age=604800,用有限时间来控制。

协商缓存优先级:ETag > Last-Modified。

Last-Modified表示本地文件最后修改日期,浏览器会在请求 header加上If-Modified-Since(上次返回的Last-Modified的值),询问服务器在该日期后资源是否有更新,有更新的话就会将新的资源发送回来。

Etag就像一个指纹,资源变化都会导致ETag变化,跟最后修改时间没有关系,ETag可以保证每一个资源是唯一的 If-None-Match的header会将上次返回的Etag发送给服务器,询问该资源的Etag是否有更新,有变动就会发送新的资源回来

注:Etag优先级是高于Last-Modifed的,所以服务器会优先验证Etag 具体为什么要用ETag,主要出于下面几种情况考虑:

  1. 一些文件也许会周期性的更改,但是他的内容并不改变(仅仅改变的修改时间),这个时候我们并不希望客户端认为这个文件被修改了,而重新获取;

  2. 某些文件修改非常频繁,比如在秒以下的时间内进行修改,(比方说1s内修改了N次),If-Modified-Since能检查到的粒度是s级的,这种修改无法判断(或者说UNIX记录MTIME只能精确到秒);

  3. 某些服务器不能精确的得到文件的最后修改时间。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1868.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CRC校验原理全面解读

目录 1. 简介2. 原理2.1 CRC的发送与接收2.2 CRC校验码的生成2.3 CRC校验码的校验 3. 拓展问题3.1 模2除法为什么等同于异或运算?3.2 为什么除数的位数和被除数补充的位数相差为1?3.3 为什么CRC校验码不能纠正错误,只能检测错误? …

基于Selenium+Python的web自动化测试框架(附框架源码+项目实战)

目录 一、什么是Selenium? 二、自动化测试框架 三、自动化框架的设计和实现 四、需要改进的模块 五、总结 总结感谢每一个认真阅读我文章的人!!! 重点:配套学习资料和视频教学 一、什么是Selenium? …

会员管理系统如何深度绑定用户?会员系统必备哪些功能?

在以消费者为主导的企业(商家)范围内,实行会员制管理能够更好的提升客户的忠诚度,减少客户的流失。完整、精确的会员管理系统,更能提升企业(商家)的实际效益。 蚓链会员管理系统(专业版) 便是这…

笔记:Nodejs 实时向 C++ 编译的可执行文件给予输入和获取输出

背景 我和几个同学当时想要去做一个多人联机的平面小游戏,但需要渲染视野。然而我们不会,只好请教大佬,而大佬不会 Javascript,所以他给我们的是 C 编译后的可执行文件,这就产生了延时。 原始方案 我当时写的是每一次…

02 QPushButton的基本使用

Tips: 在使用控件的时候如果没有智能提示,可能是没有包含头文件 在运行时,报【invalid use of xxx】可能是没有包含相关头文件 如果出现中文乱码:设置编译器的编码格式为UTF-8 本节主要包含创建一个按钮控件、显示按钮、设置按钮的父窗口、设…

Centos7安装Docker

Centos7安装Docker 目录 环境准备 安装Docker 启动Docker 切换源 启动第一个容器 环境准备 切换root权限 su root 升级所有包同时也升级软件和系统内核 yum -y update 卸载旧版本 yum remove docker docker-common docker-selinux docker-engine 卸载旧版本 yum rem…

UG\NX二次开发 捕获NX OPEN C++异常,乱码问题

文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan 简介: 捕获NX OPEN C++异常,乱码问题。 效果: 使用uc1601(ex.what(),1)显示乱码 使用 NXMessageBox()->Show("Block Styler", NXMessageBox::DialogTypeError, ex…

rce题目

<?php include "flag.php"; highlight_file(__FILE__); if(isset($_GET[HECTF])) { if (; preg_replace(/[^\W]\((?R)?\)/, NULL, $_GET[HECTF])) { if (!preg_match(/pos|high|op|na|info|dec|hex|oct|pi/i, $_GET[HECTF])) { eval(…

Kubernetes Volume及其类型(NFS、SAN) - PV - PVC - PV与PVC与Pod的关系

目录 volume 卷 官方文档&#xff1a;卷 | Kubernetes 一、emptyDir&#xff08;临时卷&#xff09; 二、hostPath卷 type字段参数 hostPath 实验&#xff1a; 三、第3方提供的存储卷&#xff08;百度云、阿里云、亚马逊云、谷歌云等&#xff09; 四、local卷 五、NF…

揭秘企业到底为什么要设立帮助中心

帮助中心是企业一个非常关键的客户服务工具&#xff0c;它可以帮助企业给客户提供高质量的售后支持和解决方案。在现在这个客户至上的年代&#xff0c;不仅要向客户提供优质的产品&#xff0c;卓越的售后服务也是不可缺少的。接下来我们就从企业和客户的角度展开讲讲为什么要设…

Nautlius Chain主网正式上线,模块Layer3时代正式开启

Nautilus Chain 是在 Vitalik Buterin 提出 Layer3 理念后&#xff0c; 对 Layer3 领域的全新探索。作为行业内首个模块化 Layer3 链&#xff0c;我们正在对 Layer3 架构进行早期的定义&#xff0c;并有望进一步打破公链赛道未来长期的发展格局。 在今年年初&#xff0c;经过我…

在有序数组中查找元素第一个和最后一个位置

某个大厂面试手撕代码遇到的题&#xff0c;血泪的教训&#xff1a; 给你一个按照非递减顺序排列的整数数组 nums&#xff0c;和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target&#xff0c;返回 [-1, -1]。 你必须设计…

WPF 复制粘贴到系统粘贴板

复制或剪切文件到剪切板 /// <summary>/// 复制或剪切文件到剪切板/// </summary>/// <param name"files">文件路径数组</param>/// <param name"cut">true:剪切&#xff1b;false:复制</param>public static void C…

Java读取Excel 单元格包含换行问题

Java读取Excel 单元格包含换行问题 需求解决方案 需求 针对用户上传的Excel数据&#xff0c;或者本地读取的Excel数据。单元格中包含了换行&#xff0c;导致读取的数据被进行了切片。 正常读取如下图所示。 解决方案 目前是把数据读取出来的cell转成字符串后&#xff0c;…

Flask新手教程

Flask简介 Flask是一个轻量级的可定制框架&#xff0c;使用Python语言编写&#xff0c;较其他同类型框架更为灵活、轻便、安全且容易上手。 Flask 可以很好地结合MVC模式进行开发&#xff0c;开发人员分工合作&#xff0c;小型团队在短时间内就可以完成功能丰富的中小型网站或…

迭代器模式:相比直接遍历集合数据,使用迭代器有哪些优势?

今天&#xff0c;我们学习另外一种行为型设计模式&#xff0c;迭代器模式。它用来遍历集合对象。不过&#xff0c;很多编程语言都将迭代器作为一个基础的类库&#xff0c;直接提供出来了。在平时开发中&#xff0c;特别是业务开发&#xff0c;我们直接使用即可&#xff0c;很少…

Vue电商项目--登录与注册

登录注册静态组件 刚刚报了一个错误&#xff0c;找不到图片的资源 assets文件夹--放置全部组件共用静态资源 在样式当中也可以使用符号【src别名】。切记在前面加上 注册业务上 先修改原先的接口成这个按钮 然后把input框里面的数据保存到data中 注册业务下 就是点击获…

Spring后置处理器BeanFactoryPostProcessor与BeanPostProcessor源码解析

文章目录 一、简介1、BeanFactoryPostProcessor2、BeanPostProcessor 二、BeanFactoryPostProcessor 源码解析1、BeanDefinitionRegistryPostProcessor 接口实现类的处理流程2、BeanFactoryPostProcessor 接口实现类的处理流程3、总结 三、BeanPostProcessor 源码解析 一、简介…

Redis之缓存穿透?怎么解决?

面试官&#xff1a;什么是缓存穿透&#xff1f;怎么解决&#xff1f; 候选人&#xff1a;嗯~ &#xff0c;缓存穿透是指查询一个一定不存在的数据。如果从DB查不到数据则不写入缓存&#xff0c;这将导致每次访问这个不存在的数据都要到DB去查询&#xff0c;高并发情况下DB可能…

安泰电子:ATA-ML100水声功率放大器模块技术参数

随着人类对海洋的深度探索和利用的不断加深&#xff0c;水下通信技术日益成为研究的热点。水下通信技术是指在海洋、湖泊等水体中实现信息传递和交流的技术手段。它不仅在海洋资源勘探、海洋环境监测等领域具有广泛应用&#xff0c;还在水下考古、水下工程等领域发挥着重要作用…