HttpUrlConnection有关

本文详细介绍HttpClient的基本使用方法,包括通过HttpURLConnection实现网络请求的具体步骤,如GET和POST请求的发送,以及如何处理GZIP压缩数据。同时介绍了如何上传文件,并提供了Android应用中需要注意的网络权限配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文地址:http://www.xuebuyuan.com/1400139.html
 

关于HttpClient用法

1.HttpURLConnection实现步骤

(1).得到HttpURLConnection对象,通过调用URL.openConnection()方法得到该对象(2).设置请求头属性,比如数据类型,数据长度等等(3).可选的操作  setDoOutput(true),默认为false无法向外写入数据!setDoInput(true),一般不用设置默认为true(4).浏览器向服务器发送的数据,比如post提交form表单或者像服务器发送一个文件(5).浏览器读取服务器发来的相应,包括servlet写进response的头数据(content-type及content-length等等),body数据(6).调用HttpURLConnection的disconnect()方法, 即设置 http.keepAlive = false;释放资源

2.GZIP压缩

对于文本数据,特别是json数据或者html网页数据,最好使用gzip进行压缩,理论上文本数据可以压缩为原来的1/3,效果很明显,压缩之后应该使用gzip流进行解压缩!

conn.setRequestProperty("Accept-Encoding", "gzip");	//设置头参数

InputStream is = new BufferedInputStream(conn.getInputStream());
String encoding = conn.getContentEncoding();
if(encoding!=null && encoding.contains("gzip")){//首先判断服务器返回的数据是否支持gzip压缩,
	is = new GZIPInputStream(is);	//如果支持则应该使用GZIPInputStream解压,否则会出现乱码无效数据
}

3.简单应用

(1).get请求

public static void get() {
	HttpURLConnection conn = null;
	try {
		URL url = new URL("http://127.0.0.1:8080/Day18/servlet/UploadTest");
	//1.得到HttpURLConnection实例化对象
		conn = (HttpURLConnection) url.openConnection();
	//2.设置请求信息(请求方式... ...)
		//设置请求方式和响应时间
		conn.setRequestMethod("GET");
		//conn.setRequestProperty("encoding","UTF-8"); //可以指定编码
		conn.setConnectTimeout(5000);
		//不使用缓存
		conn.setUseCaches(false);
	//3.读取相应
		if (conn.getResponseCode() == 200) {
			//先将服务器得到的流对象 包装 存入缓冲区,忽略了正在缓冲时间
			InputStream in = new BufferedInputStream(conn.getInputStream());
			// 得到servlet写入的头信息,response.setHeader("year", "2013");
			String year = conn.getHeaderField("year");
			System.out.println("year="+year);
			byte[] bytes = readFromInput(in);	//封装的一个方法,通过指定的输入流得到其字节数据
			System.out.println(new String(bytes, "utf-8"));
			System.out.println("[浏览器]成功!");
		} else {
			System.out.println("请求失败!");
		}
	} catch (Exception e) {
		e.printStackTrace();
	} finally {
	//4.释放资源
		if (conn != null) {
			//关闭连接 即设置 http.keepAlive = false;
			conn.disconnect();
		}
	}
}

(2).post表单提交

/**
 * post请求方式,完成form表单的提交
 */
public static void post() {
	HttpURLConnection conn = null;
	try {
		URL url = new URL("http://127.0.0.1:8080/Day18/servlet/Logining");
		String para = new String("username=admin&password=admin");
	//1.得到HttpURLConnection实例化对象
		conn = (HttpURLConnection) url.openConnection();
	//2.设置请求方式
		conn.setRequestMethod("POST");
	//3.设置post提交内容的类型和长度
		/*
		 * 只有设置contentType为application/x-www-form-urlencoded,
		 * servlet就可以直接使用request.getParameter("username");直接得到所需要信息
		 */
		conn.setRequestProperty("contentType","application/x-www-form-urlencoded");
		conn.setRequestProperty("Content-Length", String.valueOf(para.getBytes().length));
		//默认为false
		conn.setDoOutput(true);
	//4.向服务器写入数据
		conn.getOutputStream().write(para.getBytes());
	//5.得到服务器相应
		if (conn.getResponseCode() == 200) {
			System.out.println("服务器已经收到表单数据!");
		} else {
			System.out.println("请求失败!");
		}
	} catch (Exception e) {
		e.printStackTrace();
	} finally {
	//6.释放资源
			if (conn != null) {
				//关闭连接 即设置 http.keepAlive = false;
				conn.disconnect();
			}
	}
}

(3).post文件上传

/**
 * post方式,完成文件的上传
 */
private static void uploadFile() {
	HttpURLConnection conn = null;
	OutputStream out = null;
	InputStream in = null;
	FileInputStream fin = null;
	String filePath = "c:\\android帮助文档.rar";
	try {
		fin = new FileInputStream(filePath);
	//1.得到HttpURLConnection实例化对象
		conn = (HttpURLConnection) new URL("http://127.0.0.1:8080/Day18/servlet/UploadTest").openConnection();
	//2.设置请求方式
		conn.setRequestMethod("POST");
		conn.setDoOutput(true);
		//不使用缓存
		conn.setUseCaches(false);
		//conn.setRequestProperty("Range", "bytes="+start+"-"+end);多线程请求部分数据
	//3.设置请求头属性
		//上传文件的类型 rard Mime-type为application/x-rar-compressed
		conn.setRequestProperty("content-type", "application/x-rar-compressed");
		/*
		 * (1).在已知文件大小,需要上传大文件时,应该设置下面的属性,即文件长度
		 * 	当文件较小时,可以设置头信息即conn.setRequestProperty("content-length", "文件字节长度大小");
		 * (2).在文件大小不可知时,使用setChunkedStreamingMode();
		 */
		conn.setFixedLengthStreamingMode(fin.available());
		String fileName = filePath.substring(filePath.lastIndexOf("\\")+1);
		//可以将文件名称信息已头文件方式发送,在servlet中可以使用request.getHeader("filename")读取
		conn.setRequestProperty("filename", fileName);
		
	//4.向服务器中发送数据
		out = new BufferedOutputStream(conn.getOutputStream());
		long totalSize = fin.available();
		long currentSize = 0;
		int len = -1;
		byte[] bytes = new byte[1024*5];
		while ((len = fin.read(bytes)) != -1) {
			out.write(bytes);
			currentSize += len;
			System.out.println("已经长传:"+(int)(currentSize*100/(float)totalSize)+"%");
		}
		
		System.out.println("上传成功!");
	} catch (IOException e) {
		e.printStackTrace();
	} finally{
	//5.释放相应的资源 
		if(conn != null){
			conn.disconnect();
		}
	}
}

NOTE:Android使用时,应该添加网络权限

<!-- 使用网络前,需要在项目清单文件中,加入如下权限<span class="wp_keywordlink" style="margin: 0px; padding: 0px; border: 0px; background: transparent;"><a target=_blank href="http://www.xuebuyuan.com/" title="代码" target="_blank" style="text-decoration: none; color: rgb(1, 150, 227);">代码</a></span> -->
<uses-permission android:name="android.permission.INTERNET"/>

HTTPURLConnection是对Socket的封装。也就是说HTTPURLConnection就是Socket.都是用来建立一个数据传输的通道。通道有了,数据怎么传就看需要了。HttpURLConnection只是在socket的基础上对http协议进行了支持。

1.Socket 的连接是有状态的,一旦两边连接上了,将一直保持连接,除非人为断开。一般用于游戏,需要持续的网络畅通

2.URLConnection和HttpURLConnection使用的都是java.net中的类,属于标准的java接口。

HttpURLConnection继承自URLConnection,差别在与HttpURLConnection仅仅针对Http连接。

HttpURLConnection或URLConnection连接完成后不会保持连接状态。

例如浏览器访问网址,页面加载完成后,将断开连接,如果再点击,会再次连接


### Java 中 `HttpURLConnection` 的使用方法 #### 1. 基本概念 `HttpURLConnection` 是 Java 提供的一个用于执行 HTTP 请求的类。它允许开发者通过 URL 对象建立连接并发送 GET、POST 等类型的请求[^3]。 #### 2. 创建连接 要创建一个基于 `HttpURLConnection` 的 HTTP 连接,通常需要以下几个步骤: - 将目标地址封装成 `URL` 对象。 - 调用 `openConnection()` 方法获取到 `HttpURLConnection` 实例。 以下是基本代码示例: ```java import java.net.HttpURLConnection; import java.net.URL; public class HttpExample { public static void main(String[] args) throws Exception { String urlString = "http://example.com"; URL url = new URL(urlString); // 打开连接 HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); // 设置请求方式 int responseCode = conn.getResponseCode(); // 获取响应码 System.out.println("Response Code: " + responseCode); conn.disconnect(); // 断开连接 } } ``` 上述代码展示了如何打开一个简单的 HTTP GET 请求,并打印服务器返回的状态码[^1]。 #### 3. 发送 POST 请求 如果需要向服务器提交数据,则可以设置请求头以及写入请求体的内容。下面是一个完整的 POST 请求示例: ```java import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; public class PostRequestExample { public static void main(String[] args) throws Exception { String urlString = "http://example.com/api"; URL url = new URL(urlString); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setDoOutput(true); // 启用输出流 conn.setRequestMethod("POST"); conn.setRequestProperty("Content-Type", "application/json"); try(OutputStream os = conn.getOutputStream()) { // 写入 JSON 数据 byte[] input = "{\"key\":\"value\"}".getBytes("utf-8"); os.write(input, 0, input.length); } int responseCode = conn.getResponseCode(); System.out.println("Post Response Code : " + responseCode); conn.disconnect(); } } ``` 此代码片段演示了如何构建带有 JSON 数据的 POST 请求。 #### 4. 处理常见问题 ##### (1)超时设置 为了避免因网络延迟而导致程序卡住的情况,可以通过以下两个参数来设定读取和连接的时间限制: ```java conn.setConnectTimeout(5000); // 单位毫秒 conn.setReadTimeout(5000); ``` ##### (2)Android 版本兼容性 对于 Android 平台而言,在版本 2.3 及以上推荐优先选用 `HttpURLConnection` 替代已废弃的 `Apache HttpClient` 库[^2]。 ##### (3)重定向处理 默认情况下,`HttpURLConnection` 不会自动跟随 HTTP 重定向(状态码 3xx)。若希望支持该功能,需手动启用: ```java conn.setInstanceFollowRedirects(true); ``` #### 总结 综上所述,`HttpURLConnection` 是一种强大而灵活的方式来进行 HTTP 操作。尽管其配置过程可能稍显复杂,但它提供了足够的控制力去满足大多数应用场景的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值