http基础介绍 常用状态码 高级特性 multipart请求

2016-11-20 23:23:00
admin
原创 2278
摘要:http基础介绍 常用状态码 高级特性 multipart请求

一、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 资源未修改;

400 请求出错,由于语法格式有误,服务器无法理解请求;

403 禁止访问,客户端无权访问服务器的某些页面;

404 找不到资源,服务器找不到请求的文件;

405 方法不允许,比如GET和POST不匹配;

429 客户端请求过于频繁,超过服务端允许的频率限制;

500 Internal Server Error,内部服务器错误,可能是nginx出错,可能是tomcat出错;

502 Bad Gateway,网关错误,网关无法从上游服务器收到响应,nginx一般是请求fail_timeout或queue已满;

503 Service Temporarily Unavailable,服务临时不可用,服务访问量太大导致服务器过载;


三、高级特性

幂等性:

幂等性指用户对同一操作发起一次请求或者多次请求结果是一致的,比如订单支付,同一订单多次支付不能重复扣款,一般使用token解决幂等性问题,订单号是一种典型的token。


跨域说明:

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)

发表评论
评论通过审核之后才会显示。