最近线上有对接其他系统的HTTP请求,总是取不到数据,导致数据偶尔丢几次。这是个交接过来的系统,之前也没对过API,后来拿到API以及测试之后,才发现是202状态码的异步任务导致的。
202 Accepted 表示服务器端已经收到请求消息,但是尚未进行处理。但是对于请求的处理确实无保证的,即稍后无法通过 HTTP 协议给客户端发送一个异步请求来告知其请求的处理结果。这个状态码被设计用来将请求交由另外一个进程或者服务器来进行处理,或者是对请求进行批处理的情形
202状态码适合异步任务或者说需要处理时间比较长的请求,避免HTTP连接一直占用,超时这些情况。常见的就是使用MQ异步处理批任务,客户端定时轮训结果。
系统中对接的接口,大部分都是同步的请求,也就说发送一个HTTP请求,正常时候就是返回200状态码和预期的结果
client ---------> server
<---200---
这个接口的模式client第一次请求得到一个TaskID + 202状态码,之后需要client根据TaskID轮训,直到得到结果
client -----post + 参数--------> server
<----202 + TaskID -------
client -----get + TaskID -----> server
1| <- 202 + status:runing--
2| <- 200 + status:done + 返回内容
3| <- 404 or 500
如果是202还需要继续轮训
一个接口为 /api/v1/month_report, 功能是返回某个月的报表数据,处理耗时一般30~60秒,可以这样设计
-
client 发送POST /api/v1/month_report
参数为 {'month':'2019-02'}
, 服务端接受参数并且返回状态码 202,body为 {'taskid': 'cxxxx0001'}
, 服务端下发一个任务到MQ或者其他异步处理的方式,同时记录 task cxxxx0001
的状态为 running
-
10秒之后 client 发送 GET /api/v1/month_report/cxxxx0001
获取任务结果,此时服务端可能有几种情况
- 任务成功,返回 200 , 内容为
{"status": "done", "details": {....}}
- 任务还在执行中,返回 202, 内容为
{"status": "running"}
- 任务失败,返回 200(或者404), 内容为
{"status": "failure"}
-
如果client获取到是202状态,再过20s重试一次,比如说2分钟之后仍然没有成功,可以继续轮训,或者根据需要定义timeout, client方认为调用失败
当然还要根据业务情况在具体设计,上面只是个简单的参考。
最近线上有对接其他系统的HTTP请求,总是取不到数据,导致数据偶尔丢几次。这是个交接过来的系统,之前也没对过API,后来拿到API以及测试之后,才发现是202状态码的异步任务导致的。概念rfc2616MDN HTTP 202200 OK200 OK 表明请求已经成功. 默认情况下状态码为200的响应可以被缓存。不同请求方式对于请求成功的意义如下:GET: 已经取得资源,并将...
HTTP状态码(英语:HTTP Status Code)是用以表示网页服务器超文本传输协议响应状态的3位数字代码。它由 RFC 2616 规范定义的,并得到 RFC 2518、RFC 2817、RFC 2295、RFC 2774 与 RFC 4918 等规范扩展。所有状态码的第一个数字代表了响应的五种状态之一。所示的消息短语是典型的,但是可以提供任何可读取的替代方案。 除非另有说明,状态码是HTTP / 1.1标准(RFC 7231)的一部分。
响应有五种状态
一、url的组成?http和https是同一个协议吗?
组成:传输协议,域名,端口,文件位置,参数。
HTTP(顺丰):超文本传输协议(除了传递普通的文本,还可以传递文件流或者进制编码等信息),端口80
HTTPS(邮政):基于SSL(Secure Sockets Layer 安全套接层)加密的HTTP传输协议,比HTTP更加的安全(涉及支付的网站一般都是基于HTTPS完成的),端口443
FTP(货运):文件传输协议,一般用来实现资源文件在服务器上的上传下载
1. Https的作用
内容加密 建立一个信息