Http学习笔记

状态码


服务器返回的 响应报文 中第一行为状态行,包含了状态码以及原因短语,用来告知客户端请求的结果。

状态码 类别 原因短语
1XX Informational(信息性状态码) 接收的请求正在处理
2XX Success(成功状态码) 请求正常处理完毕
3XX Redirection(重定向状态码) 需要进行附加操作以完成请求
4XX Client Error(客户端错误状态码) 服务器无法处理请求
5XX Server Error(服务器错误状态码) 服务器处理请求出错
名称 状态码 说明
Accepted 202 Accepted 指示请求已被接受进行进一步处理。
Ambiguous 300 Ambiguous 指示所需的信息有多种表示形式。 默认操作是将此状态视为一个重定向,并按照与此响应关联的位置标头的内容。
BadGateway 502 BadGateway 指示中间代理服务器从另一个代理或原始服务器接收到错误响应。
BadRequest 400 BadRequest 指示无法由服务器理解此请求。 BadRequest 如果没有其他错误适用,或者如果具体的错误是未知的或不具有其自己的错误代码发送。
Conflict 409 Conflict 指示该请求可能不会执行由于在服务器上发生冲突。
Continue 100 Continue 指示客户端可以继续其请求。
Created 201 Created 指示请求导致已发送响应之前创建一个新的资源。
ExpectationFailed 417 ExpectationFailed 指示无法由服务器满足 Expect 标头中给定。
Forbidden 403 Forbidden 指示服务器拒绝无法完成请求。
Found 302 Found 指示所需的信息位于的位置标头中指定的 URI。 当收到此状态时的默认操作是遵循与响应关联的位置标头。 当原始请求方法是 POST 时,重定向的请求将使用 GET 方法。
GatewayTimeout 504 GatewayTimeout 指示中间代理服务器在等待来自另一个代理或原始服务器的响应时已超时。
Gone 410 Gone 指示所请求的资源不再可用。
HttpVersionNotSupported 505 HttpVersionNotSupported 指示服务器不支持请求的 HTTP 版本。
InternalServerError 500 InternalServerError 表示在服务器上发生一般性错误。
LengthRequired 411 LengthRequired 指示缺少必需的内容长度标头。
MethodNotAllowed 405 MethodNotAllowed 指示请求方法 (POST 或 GET) 不允许对所请求的资源。
Moved 301 Moved 指示已将所需的信息移动到的位置标头中指定的 URI。 当收到此状态时的默认操作是遵循与响应关联的位置标头。 当原始请求方法是 POST 时,重定向的请求将使用 GET 方法。
MovedPermanently 301 MovedPermanently 指示已将所需的信息移动到的位置标头中指定的 URI。 当收到此状态时的默认操作是遵循与响应关联的位置标头。
MultipleChoices 300 MultipleChoices 指示所需的信息有多种表示形式。 默认操作是将此状态视为一个重定向,并按照与此响应关联的位置标头的内容。
NoContent 204 NoContent 指示已成功处理请求和响应是有意留为空白。
NonAuthoritativeInformation 203 NonAuthoritativeInformation 指示返回的元信息来自而不是原始服务器的缓存副本,因此可能不正确。
NotAcceptable 406 NotAcceptable 表示客户端已指定使用 Accept 标头,它将不接受任何可用的资源表示。
NotFound 404 NotFound 指示所请求的资源不存在的服务器上。
NotImplemented 501 NotImplemented 指示服务器不支持所请求的功能。
NotModified 304 NotModified 指示客户端的缓存的副本是最新。 不会传输资源的内容。
OK 200 OK 指示请求成功,且请求的信息包含在响应中。 这是要接收的最常见状态代码。
PartialContent 206 PartialContent 指示根据包括字节范围的 GET 请求的请求的响应是部分响应。
PaymentRequired 402 PaymentRequired 已保留供将来使用。
PreconditionFailed 412 PreconditionFailed 表示失败,此请求的设置的条件,无法执行请求。 使用条件请求标头,如果匹配项,如设置条件无-If-match,或如果-修改-自从。
ProxyAuthenticationRequired 407 ProxyAuthenticationRequired 指示请求的代理要求身份验证。 代理服务器进行身份验证标头包含如何执行身份验证的详细信息。
Redirect 302 Redirect 指示所需的信息位于的位置标头中指定的 URI。 当收到此状态时的默认操作是遵循与响应关联的位置标头。 当原始请求方法是 POST 时,重定向的请求将使用 GET 方法。
RedirectKeepVerb 307 RedirectKeepVerb 指示请求信息位于的位置标头中指定的 URI。 当收到此状态时的默认操作是遵循与响应关联的位置标头。 当原始请求方法是 POST 时,重定向的请求还将使用 POST 方法。
RedirectMethod 303 RedirectMethod 自动将客户端重定向到的位置标头中指定作为公告的结果的 URI。 对指定的位置标头的资源的请求将会执行与 GET。
RequestedRangeNotSatisfiable 416 RequestedRangeNotSatisfiable 指示从资源请求的数据范围不能返回,或者因为范围的开始处,然后该资源的开头或范围的末尾后在资源的结尾。
RequestEntityTooLarge 413 RequestEntityTooLarge 指示请求来说太大的服务器能够处理。
RequestTimeout 408 RequestTimeout 指示客户端的服务器预期请求的时间内没有未发送请求。
RequestUriTooLong 414 RequestUriTooLong 指示 URI 太长。
ResetContent 205 ResetContent 指示客户端应重置 (而不是重新加载) 的当前资源。
SeeOther 303 SeeOther 自动将客户端重定向到的位置标头中指定作为公告的结果的 URI。 对指定的位置标头的资源的请求将会执行与 GET。
ServiceUnavailable 503 ServiceUnavailable 指示将服务器暂时不可用,通常是由于高负载或维护。
SwitchingProtocols 101 SwitchingProtocols 指示正在更改的协议版本或协议。
TemporaryRedirect 307 TemporaryRedirect 指示请求信息位于的位置标头中指定的 URI。 当收到此状态时的默认操作是遵循与响应关联的位置标头。 当原始请求方法是 POST 时,重定向的请求还将使用 POST 方法。
Unauthorized 401 Unauthorized 指示所请求的资源需要身份验证。 Www-authenticate 标头包含如何执行身份验证的详细信息。
UnsupportedMediaType 415 UnsupportedMediaType 指示该请求是不受支持的类型。
Unused 306 Unused 是对未完全指定的 HTTP/1.1 规范建议的扩展。
UpgradeRequired 426 UpgradeRequired 指示客户端应切换到不同的协议,例如 TLS/1.0。
UseProxy 305 UseProxy 指示该请求应使用的位置标头中指定的 uri 的代理服务器。

消息头


Http Request

Header 解释 示例
Accept 指定客户端能够接收的内容类型 Accept:text/plain,text/html
Accept-Charset 浏览器可以接受的字符编码集。 Accept-Charset:iso-8859-5
Accept-Encoding 指定浏览器可以支持的web服务器返回内容压缩编码类型。 Accept-Encoding:compress,gzip
Accept-Language 浏览器可接受的语言 Accept-Language:en,zh
Accept-Ranges 可以请求网页实体的一个或者多个子范围字段 Accept-Ranges:bytes
Authorization HTTP授权的授权证书 Authorization:BasicQWxhZGRpbjpvcGVuIHNlc2FtZQ==
Cache-Control 指定请求和响应遵循的缓存机制 Cache-Control:no-cache
Connection 表示是否需要持久连接。(HTTP1.1默认进行持久连接) Connection:close
Cookie HTTP请求发送时,会把保存在该请求域名下的所有cookie值一起发送给web服务器。 Cookie:$Version=1;Skin=new;
Content-Length 请求的内容长度 Content-Length:348
Content-Type 请求的与实体对应的MIME信息 Content-Type:application/x-www-form-urlencoded
Date 请求发送的日期和时间 Date:Tue,15Nov201008:12:31GMT
Expect 请求的特定的服务器行为 Expect:100-continue
From 发出请求的用户的Email From:user@email.com
Host 指定请求的服务器的域名和端口号 Host:www.huangdayu.cn
If-Match 只有请求内容与实体相匹配才有效 If-Match:“737060cd8c284d8af7ad3082f209582d”
If-Modified-Since 如果请求的部分在指定时间之后被修改则请求成功,未被修改则返回304代码 If-Modified-Since:Sat,29Oct201019:43:31GMT
If-None-Match 如果内容未改变返回304代码,参数为服务器先前发送的Etag,与服务器回应的Etag比较判断是否改变 If-None-Match:“737060cd8c284d8af7ad3082f209582d”
If-Range 如果实体未改变,服务器发送客户端丢失的部分,否则发送整个实体。参数也为Etag If-Range:“737060cd8c284d8af7ad3082f209582d”
If-Unmodified-Since 只在实体在指定时间之后未被修改才请求成功 If-Unmodified-Since:Sat,29Oct201019:43:31GMT
Max-Forwards 限制信息通过代理和网关传送的时间 Max-Forwards:10
Pragma 用来包含实现特定的指令 Pragma:no-cache
Proxy-Authorization 连接到代理的授权证书 Proxy-Authorization:BasicQWxhZGRpbjpvcGVuIHNlc2FtZQ==
Range 只请求实体的一部分,指定范围 Range:bytes=500-999
Referer 先前网页的地址,当前请求网页紧随其后,即来路 Referer:https://www.huangdayu.cn/
TE 客户端愿意接受的传输编码,并通知服务器接受接受尾加头信息 TE:trailers,deflate;q=0.5
Upgrade 向服务器指定某种传输协议以便服务器进行转换(如果支持) Upgrade:HTTP/2.0,SHTTP/1.3,IRC/6.9,RTA/x11
User-Agent User-Agent的内容包含发出请求的用户信息 User-Agent:Mozilla/5.0(Linux;X11)
Via 通知中间网关或代理服务器地址,通信协议 Via:1.0fred,1.1nowhere.com(Apache/1.1)
Warning 关于消息实体的警告信息 Warn:199Miscellaneouswarning

Http Response

Header 解释 示例
Accept-Ranges 表明服务器是否支持指定范围请求及哪种类型的分段请求 Accept-Ranges:bytes
Age 从原始服务器到代理缓存形成的估算时间(以秒计,非负) Age:12
Allow 对某网络资源的有效的请求行为,不允许则返回405 Allow:GET,HEAD
Cache-Control 告诉所有的缓存机制是否可以缓存及哪种类型 Cache-Control:no-cache
Content-Encoding web服务器支持的返回内容压缩编码类型。 Content-Encoding:gzip
Content-Language 响应体的语言 Content-Language:en,zh
Content-Length 响应体的长度 Content-Length:348
Content-Location 请求资源可替代的备用的另一地址 Content-Location:/index.htm
Content-MD5 返回资源的MD5校验值 Content-MD5:Q2hlY2sgSW50ZWdyaXR5IQ==
Content-Range 在整个返回体中本部分的字节位置 Content-Range:bytes21010-47021/47022
Content-Type 返回内容的MIME类型 Content-Type:text/html;charset=utf-8
Date 原始服务器消息发出的时间 Date:Tue,15Nov201008:12:31GMT
ETag 请求变量的实体标签的当前值 ETag:“737060cd8c284d8af7ad3082f209582d”
Expires 响应过期的日期和时间 Expires:Thu,01Dec201016:00:00GMT
Last-Modified 请求资源的最后修改时间 Last-Modified:Tue,15Nov201012:45:26GMT
Location 用来重定向接收方到非请求URL的位置来完成请求或标识新的资源 Location:https://www.huangdayu.cn
Pragma 包括实现特定的指令,它可应用到响应链上的任何接收方 Pragma:no-cache
Proxy-Authenticate 它指出认证方案和可应用到代理的该URL上的参数 Proxy-Authenticate:Basic
refresh 应用于重定向或一个新的资源被创造,在5秒之后重定向(由网景提出,被大部分浏览器支持) Refresh:5;url=https://www.huangdayu.cn
Retry-After 如果实体暂时不可取,通知客户端在指定时间之后再次尝试 Retry-After:120
Server web服务器软件名称 Server:Apache/1.3.27(Unix)(Red-Hat/Linux)
Set-Cookie 设置HttpCookie Set-Cookie:UserID=JohnDoe;Max-Age=3600;Version=1
Trailer 指出头域在分块传输编码的尾部存在 Trailer:Max-Forwards
Transfer-Encoding 文件传输编码 Transfer-Encoding:chunked
Vary 告诉下游代理是使用缓存响应还是从原始服务器请求 Vary:*
Via 告知代理客户端响应是通过哪里发送的 Via:1.0fred,1.1nowhere.com(Apache/1.1)
Warning 警告实体可能存在的问题 Warning:199Miscellaneouswarning
WWW-Authenticate 表明客户端请求实体应该使用的授权方案 WWW-Authenticate:Basic

转发与重定向

redirect

透明式间接转发,两次请求,两次处理,两次响应 。

forward

隐身式直接转发,一次请求,两次处理,一次响应。

重定向示例

1
2
3
// URLDecoder.decode 解码url
// URLEncoder.encode 编码url
String reUrl = URLDecoder.decode(redirect_uri, "utf-8") + (redirect_uri.contains("?") ? "&" : "?") + "code=" + code + "&state=" + state;

示例一

1
return "redirect:" + reUrl;

示例二(推荐)

1
2
3
4
5
6
public Object red(){
	ModelAndView modelAndView = new ModelAndView("redirect:"+URLDecoder.decode(redirect_uri, "utf-8"));
	modelAndView.addObject("code", code);//追加参数(有效)
	modelAndView.addObject("state", state);
	return modelAndView;
}

示例三(推荐)

1
2
3
4
5
6
7
public Object red(){
	RedirectView redirectView = new RedirectView(URLDecoder.decode(redirect_uri, "utf-8"));		
	redirectView.addStaticAttribute("code", code);//追加参数(有效)
	redirectView.addStaticAttribute("state", state);
	redirectView.addStaticAttribute("type", state);
	return redirectView;
}

示例四

1
2
3
4
5
6
7
public Object red(HttpServletRequest request){
	HttpHeaders httpHeaders = new HttpHeaders();
	httpHeaders.setLocation(new URI(reUrl));
	request.setAttribute("code", code);//追加参数(无效)
	request.setAttribute("state", state);
	return new ResponseEntity<Object>(httpHeaders, HttpStatus.FOUND);
}

示例五

1
2
3
4
5
6
7
public Object red(RedirectAttributes redirectAttributes){
	HttpHeaders httpHeaders = new HttpHeaders();
	httpHeaders.setLocation(new URI(reUrl));
	redirectAttributes.addAttribute("code", code);//追加参数(无效)
	redirectAttributes.addAttribute("state", state);
	return new ResponseEntity<Object>(httpHeaders, HttpStatus.FOUND);
}

示例六

1
response.sendRedirect(reUrl);

示例七

1
2
3
4
5
public Object red(RedirectAttributes redirectAttributes){
	redirectAttributes.addAttribute("code", code);//追加参数(有效)
	redirectAttributes.addAttribute("state", state);
	return new ModelAndView("redirect:"+reUrl);
}

示例八

1
2
3
4
5
6
public Object red(Model model){
	model.addAttribute("code", code);//追加参数(无效)
	model.addAttribute("state", state);
	model.addAttribute("type", state);
	return "redirect:"+URLDecoder.decode(redirect_uri, "utf-8");
}

示例九(推荐)

1
2
3
4
5
6
7
8
9
10
11
12
public Object red(Model model){
	RedirectView redirectView = new RedirectView();
	redirectView.setUrl(URLDecoder.decode(codeUrl, "utf-8"));
	redirectView.setContentType(MediaType.APPLICATION_FORM_URLENCODED_VALUE);
	redirectView.setStatusCode(HttpStatus.FOUND);
	redirectView.addStaticAttribute("client_id", clientId1);
	redirectView.addStaticAttribute("response_type", "code");
	redirectView.addStaticAttribute("redirect_uri", redirectUri);
	redirectView.addStaticAttribute("scope", scope);
	redirectView.addStaticAttribute("state", state);
	return redirectView;
}

示例十(推荐)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public Object red(Model model){
	Map<String, Object> clientMap = new HashMap<String, Object>();
	clientMap.put("client_id", clientId1);
	clientMap.put("response_type", "code");
	clientMap.put("redirect_uri", redirectUri);
	clientMap.put("scope", scope);
	clientMap.put("state", state);
	String reUrl = URLDecoder.decode(redirectUri, "utf-8");
	if (MapUtil.isNotEmpty(clientMap)) {
		for (Map.Entry<String, Object> entry : clientMap.entrySet()) {
			reUrl = reUrl + (reUrl.contains("?") ? "&" : "?") + entry.getKey() + "=" + entry.getValue();
		}
	}
	HttpHeaders httpHeaders = new HttpHeaders();
	httpHeaders.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
	httpHeaders.setLocation(new URI(reUrl));
	return new ResponseEntity<Object>(httpHeaders, HttpStatus.FOUND);
}

转发示例

1
String foUrl = "/oauth.html";

示例一

1
return "forward:"+foUrl;

示例二(推荐)

1
return new ModelAndView("forward:"+foUrl);

示例三

1
2
RequestDispatcher requestDispatcher = request.getRequestDispatcher(forUrl);
requestDispatcher.forward(request, response);

示例四

1
servletContext.getRequestDispatcher(foUrl).forward(request,response);

参考文献

菜鸟教程(推荐
RESTful API 最佳实践
HTTP状态码
文档来源

今日诗词

作者信息