HTTP协议
HTTP是基于TCP处于应用层的一种协议,与传输层协议不同,它关注的不是像TCP那样的可靠传输,而是站在应用的角度,对传输的信息来具体的使用。HTTP广泛应用于手机APP和浏览器之中。
HTTP的请求和响应
HTTP的请求格式:由Requset Header(请求头) 和Requset Body(请求体)两部分组成。
请求头: 除了第一行是 请求方法 路径 和 HTTP版本 如上图所示 POST /login HTTP/1.1表示使用POST请求,路径是 / ,版本是HTTP/1.1。之后的每一行都是以Header:Value为格式的键值对,我们称这些内容为请求头;
请求体: 它将一个页面表单中的组件值通过param1=value1 param2=value2的键值对形式编码成一个格式化串,它承载多个请求参数的数据。不但报文体可以传递请求参数,请求URL也可以通过类似于“/Demo/index.html? param1=value1param2=value2”的方式传递请求参数。
HTTP的响应格式:由Response Header(请求头) 和 Response Body(请求体)两部分组成。
响应头: 除了第一行是 HTTP版本 响应代码 响应说明,如上图所示 HTTP/1.1 200 OK 表示版本为HTTP/1.1,响应代码是200,响应说明是OK。之后的每一行都是以Header:Value为格式的键值对,我们称这些内容为响应头;
响应体:即我们所需要的内容。
HTTP的响应状态码由5段组成
1xx :表示一个提示性响应,例如101表示将切换协议,常见于WebSocket连接;
2xx :表示一个成功的响应,例如200表示成功,206表示只发送了部分内容;
3xx :表示一个重定向的响应,例如301表示永久重定向,303表示客户端应该按指定路径重新发送请求;
4xx :表示一个因客户端问题导致的错误响应,例如404表示指定的路径不存在;
5xx :表示一个因为服务器问题导致的错误响应,例如500表示服务器内部故障,503表示服务暂时无法响应;
HTTP编程
因为浏览器也是一种HTTP客户端,所以,客户端的HTTP编程,它的行为本质上和浏览器是一样的,即发送一个HTTP请求,接收服务器响应后,获得响应内容。只不过浏览器进一步把响应内容解析后渲染并展示给了用户,而我们使用Java进行HTTP客户端编程仅限于获得响应内容。下面我们以在网页上爬取一个图片为例:
1.首先通过资源定位符(URL)打开这张图片的地址。
2.通过HttpURLConnection打开对URL的连接。
3.设置请求方式,Header属性,为了让服务器不拒绝我们的访问,我们设置User-Agent属性为“Mozilla/5.0 (Windows NT 10.0; Win32; x32) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36“,模拟用户进行对服务器的访问。
4.当我们请求成功后便可以通过输入流读取该图片,通过输出流写到我们的本次磁盘上。
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
public class DataFetch {
public static void main(String[] args) {
try {
//某张电影海报的图片(该图片的统一资源定位符)
URL imageUrl = new URL("https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2875247130.webp");
//打开连接
HttpURLConnection connection = (HttpURLConnection)imageUrl.openConnection();
//设置请求方式GET
connection.setRequestMethod("GET");;
//设置请求Header属性
connection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win32; x32) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36");
//读取图片
//存储图片(写入图片的字节内容)
try(BufferedInputStream bis = new BufferedInputStream(connection.getInputStream());
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("E:\\HTTP\\douban\\海报.jpg"));){
//边度边写
byte[] buf = new byte[1024];
int len = -1;
while((len = bis.read(buf))!=-1) {
bos.write(buf, 0, len);
}
}
}catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}