在HTTP通讯中主要分为GET和POST。如PUT,DELETE是类POST的传输方式,与POST没有实质区别。OPTION是查看服务器支持的请求方法。HEAD是测试服务器的该资源状况,不返回实体的主体部分。TRACE请求能够获取回服务器接收到的该请求的原始报文,从而判断路径中的代理和防火墙是否对该条请求进行修改。前端
<请求方法> <请求路径> <协议版本> <请求头> <主体body>
为了规范,使用GET请求时就不要在主体body中放数据了,避免没必要要的错误。因此请求中的数据是放在URL上的。java
例如用GET作登陆请求spring
GET /online/test/?name=haha& password=miaomiao HTTP/1.1 Host: 127.0.0.1:8080 Content-Type: application/x-www-form-urlencoded cache-control: no-cache Postman-Token: 14a1347a-c540-48f0-9d49-6299f86c3a73
post请求能够在body中传送大量信息json
以上传name=haha,password=miaomiao为例,查看不一样body数据格式浏览器
POST /online/test/? HTTP/1.1 Host: 127.0.0.1:8080 Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW cache-control: no-cache Postman-Token: c6e21725-caec-4a40-841c-7b92f87f6999 Content-Disposition: form-data; name="name" haha Content-Disposition: form-data; name="password" miaomiao ------WebKitFormBoundary7MA4YWxkTrZu0gW--
若在表单中附加一张图片服务器
POST /online/test/? HTTP/1.1 Host: 127.0.0.1:8080 Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW cache-control: no-cache Postman-Token: 437207ba-e007-4de8-bbcd-bdc88db6e445 Content-Disposition: form-data; name="name" haha Content-Disposition: form-data; name="password" miaomiao Content-Disposition: form-data; name="profile"; filename="C:\Users\Think\Pictures\profile.jpg ------WebKitFormBoundary7MA4YWxkTrZu0gW--
POST /online/test/? HTTP/1.1 Host: 127.0.0.1:8080 Content-Type: application/x-www-form-urlencoded cache-control: no-cache Postman-Token: 35566466-0568-4731-9c1c-6eda7dfca105 name=hahapassword=miaomiaoundefined=undefined
以json格式为例app
POST /online/test/? HTTP/1.1 Host: 127.0.0.1:8080 Content-Type: application/json cache-control: no-cache Postman-Token: 06a9f071-4424-428a-b17b-9b4fe6f209a2 { "name":"haha", "password":"miaomiao" }------WebKitFormBoundary7MA4YWxkTrZu0gW--
用做传输文件,包括前面的form-data上传文件,文件都是以必定的编码方式写在body中的,在服务器端获取该请求的输入流后,便可按行接收流中的数据信息。框架
GET参数列表对于数字基本类型和包装类型均可接收,可是若前端并没传这个数字,那么包装类型能够在代码里判空,异常处理就好,可是基本类型是不能判空的,因此对于数字首选包装类型。post
@RequestMapping(value = "/",method = RequestMethod.GET) @ResponseBody private ResInfo test(String name,String password){ return new ResInfo(200,"登陆成功: "+name+" "+password); }
PostMan接收测试
{ "code": 200, "msg": "登陆成功: haha miaomiao" }
两种表单的请求Java接口均可以这样写。
@RequestMapping(value = "/",method = RequestMethod.POST) @ResponseBody private ResInfo test(String name,String password){ return new ResInfo(200,"登陆成功: "+name+" "+password); }
若表单中要上传文件,则文件项该用注解写名称,参数名均可用@RequestParam替代。只有form-data能够接收文件。
@RequestMapping(value = "/",method = RequestMethod.POST) @ResponseBody private ResInfo test(String name,String password,@RequestParam("profile") MultipartFile multipartFile){ String fileName = multipartFile.getOriginalFilename(); return new ResInfo(200,"登陆成功: "+name+" "+password+"文件名:"+fileName); }
Postman响应
{ "code": 200, "msg": "登陆成功: haha miaomiao文件名:profile.jpg" }
class User { public String name; public String password; public User() { } //若重写了构造方法,必定要写上空构造方法,不然spring不能new新对象以接收json public User(String name, String password) { this.name = name; this.password = password; } } @RequestMapping(value = "/", method = RequestMethod.POST) @ResponseBody private ResInfo test(@RequestBody User user) { return new ResInfo(200, "登陆成功: " + user.name + " " + user.password); }
Postman响应
{ "code": 200, "msg": "登陆成功: haha miaomiao" }
思想:把json对象放在body中,把单个值放在url参数列表中,因此构造请求时url和body两部分都要构造。
@RequestMapping(value = "/", method = RequestMethod.POST) @ResponseBody private ResInfo test(@RequestBody User user, String msg) { return new ResInfo(200, "登陆成功: " + user.name + " " + user.password + "msg:" + msg); }
Postman响应
{ "code": 200, "msg": "登陆成功: haha miaomiaomsg:hello, my name is msg !" }
至此完成了从HTTP构造到spring对接口解析的总结与梳理,欢迎你们指正。