admin管理员组文章数量:1568343
HTTP协议是什么?
所谓协议,就是规定,HTTP协议,就是HTTP规定。HTTP(Hypertext transfer protocol)超文本传输协议,通过浏览器和服务器进行数据交互,进行超文本(文本、图片、视频等)传输的规定。也就是说,HTTP协议规定了超文本传输所要遵守的规则。
HTTP是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型。HTTP是一个无状态的协议。HTTP默认的端口号为80,HTTPS的端口号为443。
HTTP执行流程
【 浏览器端 】
(1).输入URL (2). 发起HTTP请求 { 请求行、请求头,请求体 }
【 服务器端 】
(1).处理HTTP请求
【 浏览器端 】
(1).响应HTTP请求 { 响应码、响应头,响应体 }
例如:
响应码用来标识服务器响应的结果,大致的分类如下:
1 开头的表示消息,
2 开头表示成功,
3 开头表示重定向,
4 开头表示失败,
5 开头表示服务器异常。
请求方法
GET 请求获取Request-URI所标识的资源
POST 在Request-URI所标识的资源后附加新的数据,常用于提交表单。
HEAD 请求获取由Request-URI所标识的资源的响应消息报头
PUT 请求服务器存储一个资源,并用Request-URI作为其标识
DELETE 请求服务器删除Request-URI所标识的资源
TRACE 请求服务器回送收到的请求信息,主要用于测试或诊断
CONNECT 保留将来使用
OPTIONS 请求查询服务器的性能,或者查询与资源相关的选项和需求
HTTP消息报头
普通报头
应用于所有请求和响应消息且和请求体与响应体无关的信息就存放在普通报头中。
- Cache-Control: no-cache (用于指示请求或响应消息不能缓存)
- Date 普通报头域表示消息产生的日期和时间
- Connection: close/keep-alive (是否开启长连接)
请求报头
客户端向服务器端传递请求的附加信息以及客户端自身的信息存放在请求报头
- Accept: text/html,application/xhtml+xml,application/xml; 指定客户端接受哪些类型的信息。
- Accept-Charset: iso-8859-1,gb2312 客户端接受的字符集 (缺省是任何字符集都可以接受。)
- Accept-Encoding: gzip,deflate,sdch 可接受的内容编码。 (缺省是各种内容编码都可以接受。)
- Accept-Language: zh-CN,zh 指定语言。(缺省各种语言都可以接受。)
- Authorization 用于证明客户端有权查看某个资源
- Host: wwwblogs 被请求资源的Internet主机和端口号 (缺省端口号:80) 这个报头是必需的
- User-Agent: Mozilla/4.0(compatible;MSIE6.0;Windows NT 5.0) 操作系统、浏览器和其它属性
响应报头
响应报头允许服务器传递不能放在状态行中的附加响应信息,以及关于服务器的信息和对Request-URI所标识的资源进行下一步访问的信息。
- Location 响应报头域用于重定向接受者到一个新的位置
- Server:Apache-Coyote/1.1 服务器信息
实体报头
请求和响应消息都可以传送一个实体。
- Content-Encoding: gzip 内容编码
- Content-Language: zh-CN 语言
- Content-Length: 10 实体正文的长度
- Content-Type: text/html;charset=GB2312 返回数据的类型
- Last-Modified 实体报头域用于指示资源的最后修改日期和时间。
- Expires:Thu,15 Sep 2006 16:23:12 GMT 响应过期的日期和时间。
URI和URL的区别
URI,是uniform resource identifier,统一资源标识符,用来唯一的标识一个资源。
Web上可用的每种资源如HTML文档、图像、视频片段、程序等都是用URI来定位的,URI一般由三部组成:
①访问资源的命名机制
②存放资源的主机名
③资源自身的名称,由路径表示,着重强调于资源。URL是uniform resource locator,统一资源定位器,它是一种具体的URI,即URL可以用来标识一个资源。
URL是Internet上用来描述信息资源的字符串,主要用在各种WWW客户程序和服务器程序上。
采用URL可以用一种统一的格式来描述各种信息资源,包括文件、服务器的地址和目录等。URL一般由三部组成:
①协议(或称为服务方式)
②存有该资源的主机IP地址(有时也包括端口号)
③主机资源的具体地址。如目录和文件名等
GET方法与POST方法的区别
GET重点在从服务器上获取资源,POST重点在向服务器发送数据;
GET传输数据是通过URL请求,以键值对的形式,这个过程用户是可见的。
POST传输数据通过HTTP的POST机制,将字段与对应值封存在请求实体中发送给服务器,这个过程对用户是不可见的。
GET传输的数据量小,因为受URL长度限制,但效率较高。
POST可以传输大量数据,所以上传文件时只能用POST方式。
GET是不安全的,因为URL是可见的,可能会泄露私密信息。
POST较GET安全性较高;
GET方式只能支持ASCII字符,向服务器传的中文字符可能会乱码。
POST支持标准字符集,可以正确传递中文字符。
HTTP和HTTPS
HTTP的缺点:
通信使用明文不加密,内容可能被窃听
不验证通信方身份,可能遭到伪装
无法验证报文完整性,可能被篡改HTTPS就是HTTP加上加密处理(一般是SSL安全通信线路)+认证+完整性保护
HTTP优化
利用负载均衡优化和加速HTTP应用
利用HTTP Cache来优化网站
Java 模拟浏览器发送GET和POST请求
public void sendGet(String address) throws IOException, InterruptedException{
try {
HttpsURLConnection urlconn = null;
URL url = new URL(address);
urlconn = (HttpsURLConnection)url.openConnection();
// 设置请求方式
urlconn.setRequestMethod("GET");
// 连接超时时间
urlconn.setConnectTimeout(5000);
// 读取超时时间
urlconn.setReadTimeout(5000);
// 设置缓存
urlconn.setUseCaches(false);
urlconn.connect();
if(urlconn.getResponseCode() != 200){
System.out.println("请求失败:" + urlconn.getResponseMessage());
System.out.println("响应编码:" + urlconn.getResponseCode());
}else{
System.out.println("请求成功:" + urlconn.getResponseMessage());
System.out.println("响应编码:" + urlconn.getResponseCode());
// 获取单个 Set-Cookie 的值
String headerField = urlconn.getHeaderField("Set-Cookie");
System.out.println(headerField);
// 获取所有的请求头对应的值
Map<String, List<String>> headerFields = urlconn.getHeaderFields();
for (String keyName : headerFields.keySet()) {
List<String> list = headerFields.get(keyName);
System.out.println(keyName + ":" + list);
}
// 读取数据
InputStream inputStream = urlconn.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "UTF-8");
BufferedReader buff = new BufferedReader(inputStreamReader);
String line = buff.readLine();
while(line != null){
System.out.println(line);
line = buff.readLine();
}
urlconn.disconnect();
inputStream.close();
inputStreamReader.close();
buff.close();
}
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void sendPost(String address,Map<String,String> map) throws Exception{
try {
StringBuffer params = new StringBuffer();
for(Map.Entry<String, String> p : map.entrySet()){
params.append(p.getKey());params.append("=");
params.append(p.getValue());params.append("&");
}
if (params.length() > 0) {
params.deleteCharAt(params.length() - 1);
}
HttpsURLConnection urlconn = null;
URL url = new URL(address);
urlconn = (HttpsURLConnection)url.openConnection();
// 设置请求方式
urlconn.setRequestMethod("POST");
// 连接超时时间
urlconn.setConnectTimeout(5000);
// 读取超时时间
urlconn.setReadTimeout(5000);
// 设置缓存
urlconn.setUseCaches(false);
// 允许打印
urlconn.setDoOutput(true);
/**
* 注意:
* setRequestProperty方法,覆盖已经存在的key,如果key不存在,则会直接添加。
* addRequestProperty方法,不管key存在不存在都直接添加。
*/
// 设置使用标准编码格式编码参数的名-值对
urlconn.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
urlconn.setRequestProperty("Content-Length", String.valueOf(params.length()));
urlconn.connect();
if(urlconn.getResponseCode() != 200){
System.out.println("请求失败:" + urlconn.getResponseMessage());
System.out.println("响应编码:" + urlconn.getResponseCode());
}else{
System.out.println("请求成功:" + urlconn.getResponseMessage());
System.out.println("响应编码:" + urlconn.getResponseCode());
}
OutputStream outStream = urlconn.getOutputStream();
outStream.write(params.toString().getBytes("UTF-8"));
outStream.flush();
outStream.close();
urlconn.disconnect();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
版权声明:本文标题:HTTP协议详解及Java模拟浏览器请求 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/xitong/1726625684a1078739.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论