网站首页 > 精选教程 正文
HTTP协议
HTTP(HTTP协议是什么)是一种用于在Web浏览器和Web服务器之间交换数据的应用层协议。通过HTTP,Web浏览器可以向Web服务器发送请求并获取响应,从而实现Web页面的访问和传输。HTTP使用TCP作为传输层协议,并采用请求-响应模型来进行通信。在HTTP中,请求消息由请求行、请求头和请求正文组成,响应消息由状态行、响应头和响应正文组成。HTTP协议的设计旨在使其简单易用、可扩展性强,并具有高度的互操作性。
HTTP - Requests
HTTP客户端以请求消息的形式向服务器发送HTTP请求,该请求消息包括以下格式:
请求行
多个消息头
空行(即CRLF之前没有任何内容的行)
消息正文(可选)
请求行
请求方式有:post、get、options、delete、trace、put
常用的有:post、get
post 与 get区别:
GET使用URL或Cookie传参。而POST将数据放在BODY中。
GET的URL会有长度上的限制,而POST的数据则可以非常大。
POST比GET安全,因为数据在地址栏上不可见。
HTTP 请求消息头
Accept :告诉服务器我可以接受的 文件类型 浏览器可接受的MIME类型
Accept-Charset:浏览器可接受的字符集编码
Accept-Encoding:可以接受 以某种 格式 压缩后的数据 例如:gzip 、compress。浏览器能够进行解码的数据编码方式
Accept-Langage:浏览器支持的语言
Host:表示我所要找的 主机 是谁
User-Agent:告诉服务器,浏览器内核。
GET 请求例子
GET /hello.htm HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)
Host: www.tutorialspoint.com
Accept-Language: en-us
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
POST 请求例子
POST /cgi-bin/process.cgi HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)
Host: www.tutorialspoint.com
Content-Type: application/x-www-form-urlencoded
Content-Length: length
Accept-Language: en-us
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
licenseID=string&content=string&/paramsXML=string
HTTP - Responses
在接收并解释请求消息后,服务器使用HTTP响应消息进行响应:
HTTP 响应的基本结构
状态行
多个消息头
一个空行
实体内容
状态行
格式: http版本号 状态码 原因叙述<CRLF>
举例:HTTP/1.1 200 OK
状态码用于表示服务器对请求的处理结果,它是一个三维的十进制数。响应状态码分为5类。
状态码 | 含义 |
100~199 | 表示成功接收请求,要求客户端继续提交下一次请求才能完成整个处理过程 |
200~299 | 表示成功接收请求并已完成整个处理过程 。 常用200 |
300~399 | 为完成请求,客户端需进一步细化请求,例如:请求的资源已经移动一个新地址,常用302、307 |
400~499 | 客户端的请求有错误。常用 404 |
500~599 | 服务器端出现错误, 常用 500 |
POST响应例子
HTTP/1.1 200 OK
Date: Mon, 27 Jul 2009 12:28:53 GMT
Server: Apache/2.2.14 (Win32)
Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT
Content-Length: 88
Content-Type: text/html
Connection: Closed
<html>
<body>
<h1>Hello, World!</h1>
</body>
</html>
客户端与服务端HTTP协议交互过程
如图所示,Web浏览器与Web服务器之间的一次Http请求和响应过程,需要完成如下几个步骤。
首先,用户在浏览器地址栏中输入 http://www.google.com/index.html ,如果不指定端口,浏览器会默认为80端口。
操作系统通过查找DNS服务器进行域名解析,得到 www.google.com 对应的IP地址 74.125.31.147。
浏览器发起并建立到IP地址74.125.31.147的服务器80端口的连接,并向其发送HTTP GET请求。
服务端收到客户端发送的HTTP GET请求后,会响应一段HTML代码,浏览器根据接收到的HTML代码,下载响应的资源,样式文件,脚本文件等,并进行网友的渲染。这样,服务端的HTML文件便以图像化的形式展现在用户面前。
Socket编程实现HTTP请求发送(模拟浏览器)
下面我们使用Socket模拟HTTP向谷歌服务器发送请求,代码如下:
import java.io.*;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
public class UUIDTest {
public static void main(String[] args) throws Exception {
Socket client = new Socket("www.google.com", 80);
String request = "GET /index.html HTTP/1.1\r\n" +
"Host: www.google.com\r\n" +
"Connection: keep-alive\r\n" +
"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7\r\n" +
"Upgrade-Insecure-Requests: 1\r\n";
PrintWriter pWriter = new PrintWriter(client.getOutputStream(), true);
// 这里使用println()方法是因为 HTTP 协议在报头和报文之间,有一行空行
// 如果少了这一行空行,服务器是无法解析报文的,会出现 400 错误
pWriter.println(request);
InputStream in = client.getInputStream();
BufferedInputStream bis = new BufferedInputStream(in);
// 临时区
byte[] buffer = new byte[1024];
// 分次读取数据,每次最多读取1024个字节,将数据读取到临时区之中,同时返回读取的字节个数,如果遇到文件末尾,会返回-1
int len;
while ((len = bis.read(buffer)) != -1) {
System.out.println("-------" + len);
// 字节转为字符串
String msg = new String(buffer, 0, len, StandardCharsets.UTF_8);
System.out.println(msg);
}
in.close();
// 数据读取完毕之后,关闭输入流
client.close();
}
}
HttpClient发送HTTP请求
随着HTTP协议的广泛应用,它已经不仅仅局限于原来的浏览器/服务器模式。很多情况下,我们需要自己实现向服务端发送请求,以及解析服务器响应这个过程。但是像之前一样通过Socket API来实现这一切,会带来相当大的工作量,并且这种工作是重复且没有价值的,还可能导致一些不可预估的风险,比如底层的流处理,并发控制等。HttpClient的出现,为这一系列问题提供一个成熟的解决方案。
HttpClient是著名的开源软件组织Apache基金会下的一个子项目,它对HTTP协议通信的过程进行了封装,提供高效且功能丰富的客户端编程工具包。
下面的例子是一段通过HttpClient实现发送HTTP GET请求的代码:
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;
import java.io.*;
public class Test {
public static void main(String[] args) throws Exception, IOException, SecurityException {
try( CloseableHttpClient httpClient = HttpClientBuilder.create().build()) {
String url = "http://www.google.com/index.html";
HttpGet httpGet = new HttpGet(url);
HttpResponse httpResponse = httpClient.execute(httpGet);
HttpEntity httpEntity = httpResponse.getEntity();
String result = EntityUtils.toString(httpEntity, "utf-8");
System.out.println(result);
}
}
}
猜你喜欢
- 2024-11-05 关于 URL,说几个你不知道的点 url各部分含义
- 2024-11-05 避免自己写的 url 被diss!建议看看这篇RESTful API简明教程!
- 2024-11-05 IntelliJ IDEA 15款 神级超级牛逼插件推荐
- 2024-11-05 学习SpringMVC——如何获取请求参数
- 2024-11-05 java验证码生成(一) java生成验证码并验证
- 2024-11-05 Nice,终于有人把SpringMVC讲明白了,太简单了...
- 2024-11-05 Java代理IP设置指南:让你的网络请求更灵活
- 2024-11-05 请说说RPC的一个请求的流程是怎么样的?
- 2024-11-05 Javaweb 演示session的URL重写 java sessionid
- 2024-11-05 springboot2.2.X手册:构建全局唯一的短链接数据中心
你 发表评论:
欢迎- 04-11Java面试“字符串三兄弟”String、StringBuilder、StringBuffer
- 04-11Java中你知道几种从字符串中找指定的字符的数量
- 04-11探秘Java面试中问的最多的String、StringBuffer、StringBuilder
- 04-11Python字符串详解与示例(python字符串的常见操作)
- 04-11java正则-取出指定字符串之间的内容
- 04-11String s1 = new String("abc");这句话创建了几个字符串对象?
- 04-11java判断字符串中是否包含某个字符
- 04-11关于java开发中正确的发牌逻辑编写规范
- 最近发表
-
- Java面试“字符串三兄弟”String、StringBuilder、StringBuffer
- Java中你知道几种从字符串中找指定的字符的数量
- 探秘Java面试中问的最多的String、StringBuffer、StringBuilder
- Python字符串详解与示例(python字符串的常见操作)
- java正则-取出指定字符串之间的内容
- String s1 = new String("abc");这句话创建了几个字符串对象?
- java判断字符串中是否包含某个字符
- 关于java开发中正确的发牌逻辑编写规范
- windows、linux如何后台运行jar(并且显示进程名)
- 腾讯大佬私人收藏,GitHub上最受欢迎的100个JAVA库,值得学习
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)