HttpURLConnection
在JDK的java.net包中已经提供了访问HTTP协议的基本功能的类:HttpURLConnection。
HttpURLConnection是Java的标准类,它继承自URLConnection,可用于向指定网站发送GET请求、POST请求。它在URLConnection的基础上提供了一些便捷的方法。HttpURLConnection是一个抽象类,无法直接实例化对象。通过调用openCollection() 方法获得对象实例,默认是带gzip压缩的;
HttpURLConnection使用
HttpURLconnection是同步的请求
下面为HttpURLconnection的GET请求使用方法
@Test
void contextLoads() throws Exception {
// 创建一个URL对象
URL url = new URL("https://www.baidu.com");
// 调用URL对象的openConnection( )来获取HttpURLConnection对象实例
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
// 设置HTTP请求使用的方法:GET或者POST等
urlConnection.setRequestMethod("GET");
// 设置超时时间,毫秒值
urlConnection.setConnectTimeout(6*1000);
urlConnection.setReadTimeout(6*1000);
// 连接
urlConnection.connect();
// 得到响应流
InputStream inputStream = urlConnection.getInputStream();
// 转换成字符串
String result = inputStreamToString(inputStream);
inputStream.close();
}
注:使用connection.connect();连接网络。请求行,请求头的设置必须放在网络连接前。connection.getInputStream()只是得到一个流对象,并不是数据,不过我们可以从流中读出数据,这个流对象中只能读取一次数据,第二次读取时将会得到空数据。
下面为HttpURLconnection的POST请求使用方法
public static void main(String[] args) {
try {
// 1. 获取访问地址URL
URL url = new URL("http://localhost:8080/Servlet/do_login.do");
// 2. 创建HttpURLConnection对象
HttpURLConnection connection = (HttpURLConnection) url
.openConnection();
/* 3. 设置请求参数等 */
// 请求方式
connection.setRequestMethod("POST");
// 超时时间
connection.setConnectTimeout(3000);
// 设置是否输出
connection.setDoOutput(true);
// 设置是否读入
connection.setDoInput(true);
// 设置是否使用缓存
connection.setUseCaches(false);
// 设置此 HttpURLConnection 实例是否应该自动执行 HTTP 重定向
connection.setInstanceFollowRedirects(true);
// 设置使用标准编码格式编码参数的名-值对
connection.setRequestProperty("Content-Type",
"application/x-www-form-urlencoded");
// 连接
connection.connect();
/* 4. 处理输入输出 */
// 写入参数到请求中
String params = "username=test&password=123456";
OutputStream out = connection.getOutputStream();
out.write(params.getBytes());
out.flush();
out.close();
// 从连接中读取响应信息
String msg = "";
int code = connection.getResponseCode();
if (code == 200) {
BufferedReader reader = new BufferedReader(
new InputStreamReader(connection.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
msg += line + "\n";
}
reader.close();
}
// 5. 断开连接
connection.disconnect();
// 处理结果
System.out.println(msg);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
注:post传递参数方式为从连接中得到一个输出流,通过输出流把数据写到请求中,数据的拼接采用键值对格式,键与值之间用=连接。每个键值对之间用&连接。
使用post请求传递json格式参数
URL url = new URL(url);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("POST");
connection.setDoOutput(true);
connection.setDoInput(true);
connection.setUseCaches(false);
connection.setRequestProperty("Content-Type", "application/json;charset=utf-8");//设置参数类型是json格式
connection.connect();
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(connection.getOutputStream(), "UTF-8"));
writer.write(body);//body为json字符串
writer.close();
int responseCode = connection.getResponseCode();
if(responseCode == HttpURLConnection.HTTP_OK){
InputStream inputStream = connection.getInputStream();
String result = inputStreamToString(inputStream);//将流转换为字符串。
}
注:传递json格式数据时需要在请求头中设置参数类型是json格式
** 设置请求头**
Get请求与post请求都可以设置请求头,设置请求头的方式也是相同的。代码如下:
connection.setRequestMethod("POST");
connection.setRequestProperty("version", "1.0");//设置请求头
connection.connect();
注:设置请求头需要在连接之前进行