在java.net基础包中内置了URLConnection类,它封装了网络通信的底层实现。
URLConnection类提供了很多的方法让我们能够方便的实现应用层的网络通信。
基本步骤:
- 创建 URL 以及 URLConnection对象
- 设置 URLConnection对象的连接参数
- 连接到服务器
- 使用输出流向服务器写数据
- 使用输入流从服务器读取数据
以下是使用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流不熟悉,容易对输入输出流搞混了,可使用以下方法记:
所谓的输入和输出,都是针对我们计算机自身而言的,从外部到计算机就是输入。
从计算机到外部就是输出。网络资源在计算机外部,要获取某个网页数据到我们计算机显示就要使用输入流读入,如果要提交某个数据到指定网站,就要使用输出流写出。
- 网络通信采用用字节流来传输,不管是发送和接收,Java都提供了将字节流包装成字符流以及其他流的类,使开发人员可以很方便的操作资源。
注意事项:
1.POST请求方式记得要设置URLConnection对象的setDoOutput方法里的值为true,这样我们才可以往输出流中写出我们的参数数据。参数写出完毕后要调用输出缓冲区的flush方法刷新输出缓冲区,将缓冲区的数据输出。
2.打开的输入输出流要记得关闭。