网络编程-HTTP编程

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();
		}
	}
}

  • 7
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值