从零开始学Java之网络通信中的URL与HTTP编程

作者 :孙玉昌,昵称【一一哥 】,另外【壹壹哥】也是我哦

千锋教育高级教研员、CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者

前言

要想实现网络编程,除了可以使用Socket之外,我们还可以利用URL编程或HTTP编程技术。接下来在今天的文章中,壹哥就给大家介绍一下URL编程和HTTP编程技术,看看这两种技术有什么特点。

------------------------------前戏已做完,精彩即开始----------------------------

全文大约【4600】 字,不说废话,只讲可以让你学到技术、明白原理的纯干货!本文带有丰富的案例及配图视频,让你更好地理解和运用文中的技术概念,并可以给你带来具有足够启迪的思考......

配套开源项目资料

Github: github.com/SunLtd/Lear...

Gitee: gitee.com/sunyiyi/Lea...

一. URL简介

要想搞清楚URL编程,我们得先来看看什么是URL,所以壹哥先来给大家介绍一下URL的概念。

1. 概念

URL(Uniform Resource Locator,统一资源定位符) ,主要用于标识和定位互联网上的资源,例如网页、图片、音频、视频等。通过URL,我们可以向服务器发送请求,获取需要的资源。

2. 组成

一个URL可以由多个部分组成,包括协议、主机名、路径和查询参数等。常见的URL格式如下所示:

java 复制代码
#基本组成
protocol://host:port/path?query

#例如
http://www.qfedu.com:80/login.html?username=syc

其中,各部分含义如下所示:

  • protocol:协议部分,可以是HTTP、FTP等;
  • host :主机名或IP地址,例如 www.mobiletrain.org
  • port:端口号,例如80、8080等;
  • path:路径,用于标识具体的资源位置,例如/index.html;
  • query:查询参数,用于传递具体的参数给服务器,例如?key1=value1&key2=value2。

了解了URL的含义之后,我们就可以开始进行URL编程了。

二. URL编程

1. 简介

URL编程也是Java中用于访问互联网资源的一种标准化方式。通过URL编程,我们可以基于HTTP、FTP等协议,方便地获取网页、图片、音频、视频等资源。

另外我们也可以通过URL编程中的URLConnection、HttpURLConnection等类,向Web服务器或HTTP服务器发送请求,来建立与Web或HTTP服务器的连接,发送GET或POST请求,并读取服务器返回的响应信息。

接下来壹哥给大家分别介绍一下URL、URLConnection等与URL编程相关的核心类。

2. URL类

要实现URL编程,首先我们得使用java.net.URL类来创建一个URL对象,然后使用该对象来获取指定资源的输入流。

URL类给我们提供了多个构造方法,其中最常用的是使用URL字符串来创建URL对象。例如,以下代码就是通过URL字符串来创建一个URL对象:

java 复制代码
URL url = new URL("<www.mobiletrain.org>");

利用这个URL对象,我们可以进一步使用openStream()方法来获取指定资源的输入流。例如,以下代码就获取了指定资源的输入流:

java 复制代码
InputStream input = url.openStream();

在实际应用中,我们可以使用BufferedReader等类来处理输入流。

3. URLConnection类

3.1 简介

Java.net.URLConnection是负责与HTTP服务器建立连接的通用类,它给我们提供了一些方法可以向服务器发送请求并读取服务器的响应。比如,setRequestProperty()方法可以用于设置请求头信息,setDoOutput()方法可以用于指示是否向服务器发送请求体等。另外URLConnection还是HttpURLConnection的父类,但与之不同的是,URLConnection还额外支持FTP、Gopher等协议。

从实现原理上来说,URLConnection类主要是通过创建一个连接对象,然后使用这个连接对象向服务器发送请求并读取服务器的响应。而在创建连接对象时, URLConnection会根据指定的URL自动选择合适的网络协议。在连接对象创建成功后,我们可以使用connect()方法连接到服务器。当连接成功后,我们就可以使用getInputStream()方法来获取服务器返回的输入流,然后使用这个输入流读取服务器的响应结果。

3.2 基本使用

接下来壹哥再给大家介绍一下URLConnection类的基本使用步骤。URLConnection的使用,整体可以分为发起请求和获取响应两个步骤,所以接下来我也是按这种思路给大家进行介绍。

我们首先得创建一个URLConnection对象,代码如下:

java 复制代码
//大家可以选择一个合适的url网址
URL url = new URL("<www.mobiletrain.org>");
//获取连接对象
URLConnection conn = url.openConnection();

获取了URLConnection对象之后,我们就可以向服务器发起请求了,代码如下:

java 复制代码
//指示是否向服务器发送请求体
conn.setDoOutput(true);
//通过输出流,向服务器发送请求参数或请求体
OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream());
writer.write("param1=value1&param2=value2");
writer.flush();
writer.close();

在向服务器发送了请求之后,如果我们想得到服务器返回来的响应信息,可以使用如下方法:

java 复制代码
//获得服务器返回的响应流
InputStream input = conn.getInputStream();

然后我们就可以对这个响应流进行操作,得到具体的内容,例如下面的代码:

java 复制代码
BufferedReader reader = new BufferedReader(new InputStreamReader(input));
String line = null;
while ((line = reader.readLine()) != null) {
    System.out.println(line);
}

当然,服务器返回来的信息不一定就是文本信息,也有可能是音频、视频、文件等内容,此时如果使用字符流就不合适了。我们也可以把InputStream转换为字节流进行操作,通过字节得到合适的文件格式。

二. HTTP编程

其实HTTP编程与URL编程非常类似,两者的使用基本一致,也是要通过java.net包中的API来实现,比如URL类和HttpURLConnection、HttpClient等类。其中URL类我们已经在前面讲解过,接下来我们再了解一下HttpURLConnection类和HttpClient类的相关内容吧。

1. HttpURLConnection类

1.1 简介

HttpURLConnection继承自URLConnection类,该类也是用于与HTTP服务器建立连接的类。它提供了一些方法,可以让我们来发送HTTP请求并读取服务器的响应。

我们知道,URLConnection类是所有URL协议的通用父类,它提供了一些通用的方法来建立与服务器的连接,发送请求并读取服务器的响应。但如果我们想要更多的HTTP功能,就可以使用HttpURLConnection类,否则可以使用URLConnection类。

1.2 基本使用

接下来壹哥也把HttpURLConnection的使用步骤给大家展示一下。

如果我们要使用HttpURLConnection,首先得创建一个URL对象,然后调用该对象的openConnection()方法来强制转换得到一个HttpURLConnection对象。代码示例如下:

java 复制代码
URL url = new URL("<www.mobiletrain.org>");
//强制类型转换
HttpURLConnection conn = (HttpURLConnection) url.openConnection();

在得到连接对象之后,我们就可以发送HTTP请求了。而在发送HTTP请求之前,我们需要设置使用的HTTP请求方法。HttpURLConnection类支持HTTP协议中的各种请求方法,例如GET、POST、PUT等,我们可以使用setRequestMethod()方法进行设置,代码如下:

java 复制代码
conn.setRequestMethod("GET");

接下来在发送HTTP请求时,可以设置一些更具体的HTTP请求头,例如Content-Type、User-Agent等。而要设置HTTP请求头,我们可以使用setRequestProperty()方法。比如我们想请求json格式的内容,就可以设置如下代码:

java 复制代码
conn.setRequestProperty("Content-Type", "application/json");

在设置完HTTP请求方法和HTTP请求头之后,我们可以调用getInputStream()方法来发送请求并获取服务器的响应结果。代码如下所示:

java 复制代码
InputStream input = conn.getInputStream();

然后我们就可以获取服务器的响应结果了,比如使用BufferedReader等IO流来处理输入流。代码如下所示:

java 复制代码
BufferedReader reader = new BufferedReader(new InputStreamReader(input));
String line = null;
while ((line = reader.readLine()) != null) {
    System.out.println(line);
}

以上就是使用HttpURLConnection类发送HTTP请求并读取服务器响应的基本步骤。大家可以看到,HttpURLConnection的使用与URLConnection的用法几乎一样,只是在设置请求方法处有所差别。

1.3 其他设置

但是我们在实际应用中,还要注意异常的处理、设置连接的超时时间、发送POST请求等问题。

我们在使用HttpURLConnection类发送HTTP请求时,可能会发生各种异常,例如网络连接异常、服务器返回错误等。所以为了保证程序的健壮性,我们必须对异常进行适当的处理。代码如下所示:

java 复制代码
try {
    URL url = new URL("<www.mobiletrain.org>");
    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    InputStream input = conn.getInputStream();
} catch (IOException e) {
    e.printStackTrace();
}

另外我们在使用HttpURLConnection类发送HTTP请求时,可能会因为网络原因等导致连接超时。为了避免连接超时的情况,可以通过setConnectTimeout()方法来设置连接超时时间。以下代码设置连接超时时间为5秒:

java 复制代码
conn.setConnectTimeout(5000);

1.4 发送POST请求

在前面的案例中,壹哥给大家讲解了如何发送GET请求。实际上,GET请求和POST请求是不太一样的。POST请求比GET请求能够携带更多的数据,也更安全。

如果我们要发送POST请求,可以使用setRequestMethod()方法,并将请求方法设置为POST。然后使用setDoOutput()方法打开输出流,并将数据写入输出流。代码如下所示:

java 复制代码
try {
    URL url = new URL("<www.mobiletrain.org>");
    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    //设置post请求
    conn.setRequestMethod("POST");
    conn.setDoOutput(true);
    OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream());
    //传递请求参数
    writer.write("username=john&password=123456");
    writer.flush();
    writer.close();
    //获取响应结果
    InputStream input = conn.getInputStream();
    ......
    ......
} catch (IOException e) {
    e.printStackTrace();
}

以上就是HttpURLConnection类的基本使用步骤了,大家会发现,其实该类与URLConnection的用法基本大同小异,并没有额外的难度。

1.5 综合案例--下载文件

接下来壹哥就编写一个案例,利用HttpURLConnection来下载一个网络图片到F盘中。

java 复制代码
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

import org.apache.http.client.ClientProtocolException;

/**
 * @author 一一哥Sun
 * @company 千锋教育
 */
public class Demo03 {

	public static void main(String[] args) throws ClientProtocolException, IOException {
		//创建一个URL对象,关联图片地址
		URL url = new URL("http://www.mobiletrain.org/images/index/new_logo.png"); 
		//得到一个HttpURLConnection对象
		HttpURLConnection connection = (HttpURLConnection) url.openConnection();
		//设置请求方法
		connection.setRequestMethod("GET");
		//得到响应结果
		InputStream inputStream = connection.getInputStream();
		//创建文件
		File file=new File("F://logo.png");
		//利用IO流输出内容到文件中
		FileOutputStream outputStream = new FileOutputStream(file); 
		byte[] buffer = new byte[1024];
		int bytesRead;
		while ((bytesRead = inputStream.read(buffer)) != -1) {
		    outputStream.write(buffer, 0, bytesRead);
		}
		//关闭资源
		outputStream.close();
		inputStream.close();
		//关闭连接
		connection.disconnect();
	}
}

在这个案例中,大家记得要把文件的路径盘符设置成自己的,不一定要和我的一样。而且我们不仅可以下载一个图片,也可以下载任意格式的文件,你可以根据壹哥的代码试试哦。

2. HttpClient类

2.1 简介

HttpClient是Apache软件基金会中提供的用于发送HTTP请求的开源框架,它提供了比HttpURLConnection更加简单、灵活、可靠的请求方式,使用起来更加的方便。我们经常使用HttpClient构建HTTP客户端程序,比如在Android移动端中请求Web服务器的接口。

HttpClient作为一个优秀的开源框架,具有如下特点:

  • 支持HTTP/1.1和HTTP/2协议;
  • 支持同步和异步请求;
  • 支持连接池和连接复用;
  • 支持自定义的连接超时时间和请求超时时间;
  • 支持自定义的请求头和响应头;
  • 支持自定义的Cookie管理和认证方式;
  • 支持代理服务器和SSL/TLS安全协议。

2.2 基本使用

HttpClient框架给我们提供了HttpGet和HttpPost类,分别表示GET和POST请求。通过这些类,我们可以设置请求头、请求参数、请求体等信息,并可以获取服务器的响应结果。另外HttpClient还给我们提供了一些其他的功能,比如连接池、请求重试、状态管理等。接下来壹哥就给大家说一下HttpClient的基本开发步骤。

因为HttpClient是Apache中的开源项目,所以Java源码中并没有自带该类,如果我们想在Java项目中使用HttpClient,需要先导入HttpClient的依赖包。关于导入依赖包,以后我们可以使用Maven或Gradle进行导入,以后壹哥 也会开辟专门的Maven专栏,欢迎大家持续关注壹哥哦。但现在我们还不具备这些知识,所以可以提前把HttpClient的jar包下载下来,然后手动导入到Java项目中。有了jar包之后,接下来就是基本的开发步骤了。

首先我们要创建一个HttpClient对象,代码如下:

java 复制代码
CloseableHttpClient client = HttpClients.createDefault();

然后再创建一个Http请求对象,如果想发起Get请求就创建HttpGet对象,想发起Post请求就创建HttpPost对象,代码如下所示:

java 复制代码
HttpGet request = new HttpGet(url);

然后利用创建好的请求对象来设置请求头,代码如下:

java 复制代码
request.setHeader("Content-Type", "application/json");

接下来我们就可以利用HttpClient对象,发送请求并获取响应对象了,代码如下所示:

java 复制代码
CloseableHttpResponse response = client.execute(request);

接着我们就可以处理响应数据了,代码如下所示:

java 复制代码
HttpEntity entity = response.getEntity();
String content = EntityUtils.toString(entity);

最后要关闭响应对象和HttpClient对象。

java 复制代码
response.close();
client.close();

利用以上几行代码,我们就可以很轻松地实现网络请求并得到响应结果。

2.3 综合案例--请求json

壹哥设计了一个通过Get请求获取json接口的案例,但在编写代码之前,我们需要提前导入HttpClient的依赖包,如下图所示:

导入了依赖包之后,我们就可以进行代码实现了。

java 复制代码
import org.apache.http.HttpEntity;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

/**
 * @author 一一哥Sun
 * @company 千锋教育
 */
public class Demo02 {

	public static void main(String[] args) throws ClientProtocolException, IOException {
		//这是一个json接口地址
        String url = "https://json.tewx.cn/json/API_kdd531mytfdzm06i?sdAS1dsnuUa3sd=190001&Jsdh4bajs99dii=sohpuisypf4nfaei";
		//创建一个HttpClient对象
		CloseableHttpClient client = HttpClients.createDefault();
        //创建一个Get请求对象
        HttpGet request = new HttpGet(url);
        //设置请求头
        request.setHeader("Content-Type", "application/json");
        //执行请求,获取响应结果
        CloseableHttpResponse response = client.execute(request);
        //得到响应体
        HttpEntity entity = response.getEntity();
        //将响应结果转为字符串
        String content = EntityUtils.toString(entity);
        System.out.println(content);
	}
}

以上几行代码,我们就可以把网上的JSON接口内容请求下来,如下图所示:

其实利用HttpURLConnection也可以实现这样的效果,两者的功能都是相似的,但两者之间也有一些区别。

3. HttpURLConnection与HttpClient的区别

HttpURLConnection是Java标准库中用于发送HTTP请求的类。它提供了一些方法用来建立与HTTP服务器的连接、设置HTTP请求方法、设置HTTP请求头、发送请求、获取服务器的响应等。该类使用起来比较麻烦,但能够满足基本的HTTP请求需求。

HttpClient是一种用于发送HTTP请求的开源框架,它提供了更加简单、灵活、可靠的HTTP请求方式,使用起来比Java标准库中的HttpURLConnection更加方便。

所以如果我们只是想要进行较为简单的HTTP请求,可以使用HttpURLConnection;如果需要实现更复杂的HTTP请求,则推荐使用HttpClient。

------------------------------正片已结束,来根事后烟----------------------------

三. 结语

至此,壹哥就给大家讲解了URL编程和HTTP编程,你学会了吗?其实无论我们是进行URL编程,还是进行HTTP编程,这两者的实现过程其实很相似,但在进行实现的时候,我们需要注意以下事项:

  • 在URL编程中,我们必须确保URL是一个正确的地址,否则可能会导致URL编程失败;
  • 在HttpURLConnection编程中,必须确保正确地设置HTTP请求头,否则也可能会导致服务器无法正确地处理请求;
  • 在URLConnection编程中,必须要正确地处理HTTP响应头,否则可能会导致无法正确地读取响应结果;
  • 另外在实际应用中,我们还要处理各种异常和错误,以确保程序的正确性和稳定性。

总之,URL编程和HTTP编程都是Java中用于访问互联网资源的标准化方式,Java给我们提供了URL类、HttpURLConnection类和URLConnection类来实现。我们只要在实际应用中,注意URL字符串的处理、HTTP请求头的设置、HTTP响应头的处理以及异常和错误的处理,进行这些开发并不难。

如果你独自学习觉得有很多困难,可以加入壹哥的学习互助群,大家一起交流学习。

相关推荐
葫芦和十三6 小时前
图解 MongoDB 21|选举与 failover:Primary 是怎么选出来的
后端·mongodb·agent
GetcharZp6 小时前
26k Star 开源内网穿透神器 NetBird,一分钟实现全球设备互联!
后端
考虑考虑7 小时前
Mybatis实现批量插入
java·后端·mybatis
咖啡八杯7 小时前
GoF设计模式——中介者模式
java·后端·spring·设计模式
lizhongxuan10 小时前
多Agent之间的区别
后端
青石路11 小时前
记一次多JDK版本问题的排查,一坑套一坑,差点没爬上来
java
杨充12 小时前
1.面向对象设计思想
后端
IT_陈寒12 小时前
Java的Date类又坑了我一次,改用时间戳真香
前端·人工智能·后端
systemPro13 小时前
2.6亿条设备数据,历史查询从超时到50ms,我做了什么
后端
要阿尔卑斯吗13 小时前
提示词优化启示:为什么“按顺序输出“比“关键度评分“更有效
后端