http基础介绍 常用状态码 跨域介绍 multipart请求
- 2016-11-20 23:23:00
- admin
- 原创 2630
一、http基础介绍
1、官方文档:https://developer.mozilla.org/en-US/docs/Web/HTTP
2、HTTP/1.X,当前版本超文本传输协议,可以使用HTTP和HTTPS;
3、HTTP/2.X,下一代超文本传输协议,只能使用HTTPS,速度更快,安全性更高;
4、RequestMapping注解不设置method属性表示支持任意请求方法;
5、org.springframework.http.HttpHeaders定义了请求头和返回头常量;
6、org.springframework.http.MediaType定义了常用内容类型常量;
7、后台动态生成网页推荐使用JSP或FreeMarker;
8、内容类型列表:mime-type.txt
常用内容类型:
Content-Type: text/html
Content-Type: text/plain
Content-Type: application/json
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Content-Type: multipart/form-data
二、http常用状态码
200 请求成功;
301 永久移动,请求的网页被永久移动到新位置;302 临时移动,服务器使用临时地址来响应请求,客户端使用原始地址进行后续请求;
304 资源未修改;
307 Internal Redirect,浏览器直接重定向,比如HSTS;
400 请求出错,由于语法格式有误,服务器无法理解请求;
403 禁止访问,客户端无权访问服务器的某些页面;
404 找不到资源,服务器找不到请求的文件;
405 方法不允许,比如GET和POST不匹配;
429 客户端请求过于频繁,超过服务端允许的频率限制;
500 Internal Server Error,内部服务器错误,可能是nginx出错,可能是tomcat出错;
502 Bad Gateway,网关错误,网关从上游服务器收到错误响应,nginx一般是请求fail_timeout或queue已满;
504 Gateway Time-out,网关超时,网关无法从上游服务器收到响应,nginx一般是上游处理时间太长;
503 Service Temporarily Unavailable,服务临时不可用,服务访问量太大导致服务器过载;
三、跨域介绍
1、CORS,Cross-Origin Resource Sharing,跨域请求是JS在一个站点中请求另一个站点的资源;
2、静态链接和表单动作不属于跨域,跨域示例:crosssite.txt
3、OPTIONS请求可以判断服务是否支持跨域,返回200表示允许跨域,返回403表示不允许跨域;
4、服务允许跨域,客户端才能发起真正的GET和POST请求;
5、iframe可以发起跨域请求,但是无法获取浏览器cookie;
单点登录跨域登出方案:
1、应用后台实现logout;
2、logout失效当前会话;
3、应用后台重定向到单点登出;
OPTIONS请求:
OPTIONS /api/request HTTP/1.1
Host: 127.0.0.1:8080
Access-Control-Request-Method: GET
Access-Control-Request-Headers: Content-Type
Origin: http://www.other.com
OPTIONS返回:
HTTP/1.1 200
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: HEAD,DELETE,POST,GET,OPTIONS,PUT
Access-Control-Max-Age: 1800
Content-Length: 0
允许跨域:
<filter>
<filter-name>CorsFilter</filter-name>
<filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
<init-param>
<param-name>cors.allowed.origins</param-name>
<param-value>*</param-value>
</init-param>
<init-param>
<param-name>cors.allowed.methods</param-name>
<param-value>GET,POST,HEAD,OPTIONS,PUT,DELETE</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CorsFilter</filter-name>
<url-pattern>*</url-pattern>
</filter-mapping>
四、multipart请求
1、普通post请求,Content-Type: application/x-www-form-urlencoded
2、上传文件post请求,Content-Type: multipart/form-data; boundary=${bound}
3、示例代码下载:multipart-form-demo.py
请求代码片段:
def build_post_body(request, img_list):
boundary = '----WebKitFormBoundaryrGKCBY7qhFd3TrwA'
data = []
data.append('--%s' % boundary)
data.append('Content-Disposition: form-data; name="%s"\r\n' % 'request')
data.append(request)
for img in img_list:
data.append('--%s' % boundary)
fd = open(img, 'rb')
data.append('Content-Disposition: form-data; name="%s"; filename="%s"'
% (img.split(os.sep)[-1], img.split(os.sep)[-1]))
data.append('Content-Type: %s\r\n' % 'image/jpeg')
data.append(fd.read())
fd.close()
data.append('--%s--\r\n' % boundary)
return boundary, '\r\n'.join(data)