在java.net基础包中内置了URLConnection类,它封装了网络通信的底层实现。
URLConnection类提供了很多的方法让我们能够方便的实现应用层的网络通信。

基本步骤:

  1. 创建 URL 以及 URLConnection对象
  2. 设置 URLConnection对象的连接参数
  3. 连接到服务器
  4. 使用输出流向服务器写数据
  5. 使用输入流从服务器读取数据

以下是使用URLConnection进行GET和POST请求的基础示例程序:

package com.lanshiqin.utils.net;

import java.io.*;
import java.net.URL;
import java.net.URLConnection;

/**
 *
 * @author xieh 2019/9/8 网络请求工具类
 *
 */
public class NetUtil {

	/**
	 * 使用GET方法读取http中的数据
	 *
	 * @param urlAddress
	 *            url地址
	 * @return 请求的响应数据
	 */
	public static String doGET(String urlAddress) {
		try {
			// 创建URL对象
			URL url = new URL(urlAddress);
			// 打开连接 获取连接对象
			URLConnection connection = url.openConnection();

			// 从连接对象中获取网络连接中的输入字节流对象
			InputStream inputStream = connection.getInputStream();
			// 将输入字节流包装成输入字符流对象,并进行字符编码
			InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "UTF-8");
			// 创建一个输入缓冲区对象,将字符流对象传入
			BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

			// 定义一个字符串变量,用来接收输入缓冲区中的每一行字符串数据
			String line;
			// 创建一个可变字符串对象,用来装载缓冲区对象的数据,使用字符串追加的方式,将响应的所有数据都保存在该对象中
			StringBuilder stringBuilder = new StringBuilder();
			// 使用循环逐行读取输入缓冲区的数据,每次循环读入一行字符串数据赋值给line字符串变量,直到读取的行为空时标识内容读取结束循环
			while ((line = bufferedReader.readLine()) != null) {
				// 将从输入缓冲区读取到的数据追加到可变字符对象中
				stringBuilder.append(line);
			}
			// 依次关闭打开的输入流
			bufferedReader.close();
			inputStreamReader.close();
			inputStream.close();
			// 将可变字符串转换成String对象返回
			return stringBuilder.toString();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 使用POST方法读取HTTP中的数据
	 *
	 * @param urlAddress
	 *            url地址
	 * @param params
	 *            参数
	 * @return 请求的响应数据
	 */
	public static String doPOST(String urlAddress, String params) {
		try {
			// 创建URL对象
			URL url = new URL(urlAddress);
			// 打开连接 获取连接对象
			URLConnection connection = url.openConnection();
			// 设置请求编码
			connection.addRequestProperty("encoding", "UTF-8");
			// 设置允许输入
			connection.setDoInput(true);
			// 设置允许输出
			connection.setDoOutput(true);

			// 从连接对象中获取输出字节流对象
			OutputStream outputStream = connection.getOutputStream();
			// 将输出的字节流对象包装成字符流写出对象
			OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream);
			// 创建一个输出缓冲区对象,将要输出的字符流写出对象传入
			BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter);
			// 向输出缓冲区中写入请求参数
			bufferedWriter.write(params);
			// 刷新输出缓冲区
			bufferedWriter.flush();

			// 从连接对象中获取输入字节流对象
			InputStream inputStream = connection.getInputStream();
			// 将输入字节流对象包装成输入字符流对象,并将字符编码为UTF-8格式
			InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "UTF-8");
			// 创建一个输入缓冲区对象,将要输入的字符流对象传入
			BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

			// 创建一个字符串对象,用来接收每次从输入缓冲区中读入的字符串
			String line;
			// 创建一个可变字符串对象,用来装载缓冲区对象的最终数据,使用字符串追加的方式,将响应的所有数据都保存在该对象中
			StringBuilder stringBuilder = new StringBuilder();
			// 使用循环逐行读取缓冲区的数据,每次循环读入一行字符串数据赋值给line字符串变量,直到读取的行为空时标识内容读取结束循环
			while ((line = bufferedReader.readLine()) != null) {
				// 将缓冲区读取到的数据追加到可变字符对象中
				stringBuilder.append(line);
			}
			// 依次关闭打开的输入流
			bufferedReader.close();
			inputStreamReader.close();
			inputStream.close();
			// 依次关闭打开的输出流
			bufferedWriter.close();
			outputStreamWriter.close();
			outputStream.close();
			// 将可变字符串转换成String对象返回
			return stringBuilder.toString();

		} catch (IOException e) {
			e.printStackTrace();
		}
		return null;
	}

}

以上示例程序是假设这个一个普通的网页资源,所以将字节流直接包装成字符流进行操作了。如果要上次或者下载文件,就需要将字节流包装成文件流。

记忆要点:
对Java的IO流不熟悉,容易对输入输出流搞混了,可使用以下方法记:
所谓的输入和输出,都是针对我们计算机自身而言的,从外部到计算机就是输入。
从计算机到外部就是输出。网络资源在计算机外部,要获取某个网页数据到我们计算机显示就要使用输入流读入,如果要提交某个数据到指定网站,就要使用输出流写出。

  1. 网络通信采用用字节流来传输,不管是发送和接收,Java都提供了将字节流包装成字符流以及其他流的类,使开发人员可以很方便的操作资源。

注意事项:
1.POST请求方式记得要设置URLConnection对象的setDoOutput方法里的值为true,这样我们才可以往输出流中写出我们的参数数据。参数写出完毕后要调用输出缓冲区的flush方法刷新输出缓冲区,将缓冲区的数据输出。
2.打开的输入输出流要记得关闭。

09-09 00:26