目录
RESTFUL接口的Web服务
(一)HTTP协议
1.简介
超文本传输协议(Hyper Text Transfer Protocol,HTTP)是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。请求和响应消息的头以ASCII形式给出;而消息内容则具有一个类似MIME的格式。
名称 | 解释 |
---|---|
中文名 | 超文本传输协议 |
外文名 | HTTP |
工作层 | 应用层 |
基 础 | 架构在TCP上 |
适用浏览器 | Firefox、Google Chrome等 |
作 用 | 规定WWW服务器与浏览器之间信息传递规范 |
2.工作原理
HTTP是基于客户/服务器模式,且面向连接的。典型的HTTP事务处理有如下的过程:
在这里插入代码片
(1)客户与服务器建立连接;
(2)客户向服务器提出请求;
(3)服务器接受请求,并根据请求返回相应的文件作为应答;
(4)客户与服务器关闭连接。
(二)B/S和HTTP的请求和响应
1.相关概念
(1)连接Connection:
浏览器与服务器之间传输超文本的通道。通常,浏览器在请求之前需要与服务器连接,保持通信通道打开,才可以进行后面一系列的请求等操作,服务器会开通连接,并对发
(2)请求Request:
浏览器对服务器发送的一系列消息,希望可以在服务器端获取到自己想要的数据。而这些消息就是浏览器对服务器发出的请求,一般包括请求的类型,请求的数据,请求的浏览器信息等
(3)响应Response:
服务器在接到浏览器发出的请求后,会对这些请求做出处理,并向浏览器进行反馈。反馈的数据包括浏览器的请求是否成功,状态码,浏览请请求所需要的数据信息等(一个html页面,图片等等)
2.B/S和HTTP的请求和响应过程
(1)浏览器根据所使用的http协议,解析出url对应的域名
(2)通过DNS域名解析,查询出对应的ip地址
(3)通过url解析出对应的端口号,如果是80端口,默认可以省略
(4)浏览器发起并建立到ip地址的80端口的连接
(5)浏览器向服务器发送get请求
(6)服务器响应浏览器的请求,浏览器读取响应,渲染网页
(7)浏览器关闭与服务器的连接
3.响应状态码
“200” : OK
“302” : Found 重定向.
“400” : Bad Request 错误请求,发出错误的不符合Http协议的请求
“403” : Forbidden 禁止
“404” : Not Found 未找到。演示访问一个不存在的页面看报文
“500” : Internal Server Error 服务器内部错误。演示页面抛出异常。
4.四种请求类型
(1)GET请求会向数据库发索取数据的请求,从而来获取信息,该请求就像数据库的select操作一样,只是用来查询一下数据,不会修改、增加数据,不会影响资源的内容,即该请求不会产生副作用。无论进行多少次操作,结果都是一样的。
(2)与GET不同的是,PUT请求是向服务器端发送数据的,从而改变信息,该请求就像数据库的update操作一样,用来修改数据的内容,但是不会增加数据的种类等,也就是说无论进行多少次PUT操作,其结果并没有不同。
(3)POST请求同PUT请求类似,都是向服务器端发送数据的,但是该请求会改变数据的种类等资源,就像数据库的insert操作一样,会创建新的内容。POST的安全性要比GET的安全性高
(4)DELETE请求顾名思义,就是用来删除某一个资源的,该请求就像数据库的delete操作
(三) 浏览器和服务器端数据传输的多种方式
Ajax,在它最基本的层面,是一种与服务器通讯而不重载当前页面的方法,数据可从服务器获得或发送给服务器。有多种不同的方法构造这种通讯通道,每种方法都有自己的优势和限制。
有五种常用技术用于向服务器请求数据:
(1)XMLHttpRequest (XHR)
(2)动态脚本标签插入
(3)框架
(4)Comet
(5)多部分的XHR
1.XMLHttpRequest (XHR)
目前最常用的方法中,XMLHttpRequest(XHR)用来异步收发数据。所有现代浏览器都能够很好地支持它,而且能够精细地控制发送请求和数据接收。你可以向请求报文中添加任意的头信息和参数(包括GET和POST),并读取从服务器返回的头信息,以及响应文本自身
2.动态脚本标签插入
该技术克服了XHR的最大限制:它可以从不同域的服务器上获取数据。这是一种黑客技术,而不是实例化一个专用对象,你用JavaScript创建了一个新脚本标签,并将它的源属性设置为一个指向不同域的URL
3.多部分XHR
多部分XHR(MXHR)允许你只用一个HTTP 请求就可以从服务器端获取多个资源。它通过将资源(可以是CSS 文件,HTML 片段,JavaScript代码,或base64 编码的图片)打包成一个由特定分隔符界定的大字符串,从服务器端发送到客户端。JavaScript代码处理此长字符串,根据它的媒体类型和其他“信息头”解析出每个资源
(四)使用IDEA创建三个restful风格的接口
1.接口创建
(1)在创建好的SpringWeb项目的HelloWeb创建四个包beans、controller、manager、service,在这四个包下新疆四个类
(2)beans/Count
package beans;
public class Count {
private int count;
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
}
(3)controller/ResourceController
package controller;
import beans.Count;
import service.ResourceService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
public class ResourceController {
@Autowired
ResourceService resourceService;
@RequestMapping(value = "/count", method = RequestMethod.PUT)
@ResponseBody
public void initCount(@RequestBody Count count) {
resourceService.initCount(count);
}
@RequestMapping(value = "/count", method = RequestMethod.POST)
@ResponseBody
public void modifyCount(@RequestBody Count count) {
resourceService.addCount(count);
}
@RequestMapping(value = "/count", method = RequestMethod.GET)
@ResponseBody
public Count getCount() {
return resourceService.getCount();
}
}
(4)manager.ResourceManager
package manager;
public class ResourceManager {
private int count = 0;
private static ResourceManager instance = new ResourceManager();
private ResourceManager(){}
public static ResourceManager getInstance(){
return instance;
}
public synchronized void addCount(int i){ count = count + i;
}
public synchronized void minusCount(int i){
count = count -i;
}
public int getCount(){
return count;
}
public void initCount(int i){
count = i;
}
}
(5)service.ResourceService
package service;
import beans.Count;
import manager.ResourceManager;
public class ResourceService {
public void addCount(Count count){
if (count != null){
ResourceManager.getInstance().addCount(count.getCount());
}
}
public void minusCount(Count count){
if (count != null) {
ResourceManager.getInstance().minusCount(count.getCount());
}
}
public Count getCount()
{
Count count = new Count();
count.setCount(ResourceManager.getInstance().getCount());
return count;
}
public void initCount(Count count){
if (count != null) {
ResourceManager.getInstance().initCount(count.getCount());
}
}
}
2. 启动服务
(1)右键点击
(2)服务启动成功
(3)浏览器输入localhost:8080/count
(五)Postman测试
1.点击Create New
2.点击Connection
3.点击命名为HelloWeb
4,展开HelloWeb,点击add requestion
5.输入url为localhost:8080/cout
6.发送GET请求成功
7.发送POST请求成功
9.发送PUT请求成功
参考资料
HTTP百度百科
浅谈HTTP中Get、Post、Put与Delete的区别
Http与服务器的交互(主要post和get)