Android HttpURLConnection实战:GET/POST JSON与图片下载
52 浏览量
更新于2024-08-30
收藏 51KB PDF 举报
"Android开发中,由于Android6.0开始弃用了Apache HTTP Client,转而推荐使用HttpURLConnection进行网络请求。本文将重点介绍如何使用HttpURLConnection实现GET和POST方式提交JSON数据,以及如何下载图片,包括显示进度和不显示进度的情况。在处理中文数据时,需要注意UTF-8编码的转换,否则可能导致HTTP400错误。"
在Android应用开发中,网络通信是必不可少的部分。随着Android系统版本的更新,开发人员需要遵循最佳实践,比如在Android6.0及以上版本中,应使用HttpURLConnection代替Apache HTTP Client。这是因为HttpURLConnection提供了更好的性能和更低的内存消耗。
1. GET请求JSON数据:
GET请求通常用于获取服务器上的数据。以下是一个简单的示例:
```java
public UserDto execute(String[] params) {
InputStream inputStream = null;
HttpURLConnection urlConnection = null;
try {
String urlWithParams = DOMAIN_ADDRESS + MEMBER_REQUEST_TOKEN_URL + "?userName=" +
java.net.URLEncoder.encode(params[0], "utf-8") + "&password=" + params[1];
URL url = new URL(urlWithParams);
urlConnection = (HttpURLConnection) url.openConnection();
// 设置请求头
urlConnection.setRequestProperty("Content-Type", "application/json;charset=UTF-8");
urlConnection.setRequestProperty("Accept", "application/json");
// 获取响应
int responseCode = urlConnection.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) {
inputStream = urlConnection.getInputStream();
// 解析输入流,得到JSON数据并转化为UserDto对象
}
} catch (Exception e) {
// 处理异常
} finally {
// 关闭连接和流
if (inputStream != null) {
inputStream.close();
}
if (urlConnection != null) {
urlConnection.disconnect();
}
}
}
```
在这个例子中,我们首先构建了包含参数的URL,然后打开连接并设置请求头,表明我们期望接收JSON格式的数据。如果响应状态码为200(HTTP_OK),则读取输入流并处理返回的JSON数据。
2. POST提交JSON数据:
POST请求常用于向服务器发送数据,例如登录或注册用户。以下是如何发送JSON数据的示例:
```java
public void sendJsonData(String jsonData) throws IOException {
HttpURLConnection urlConnection = null;
try {
URL url = new URL(SERVER_API_URL);
urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setRequestMethod("POST");
urlConnection.setDoOutput(true); // 允许写入数据
// 设置请求头
urlConnection.setRequestProperty("Content-Type", "application/json;charset=UTF-8");
// 写入JSON数据到输出流
try (OutputStream os = urlConnection.getOutputStream()) {
os.write(jsonData.getBytes("utf-8"));
}
// 获取响应
int responseCode = urlConnection.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) {
// 处理响应
}
} finally {
if (urlConnection != null) {
urlConnection.disconnect();
}
}
}
```
这里,我们设置了"Content-Type"为"application/json;charset=UTF-8",表示我们要发送的是JSON格式的数据,并通过`setDoOutput(true)`允许写入数据到连接。
3. 下载图片:
下载图片可以分为显示进度和不显示进度两种情况。基本步骤包括:创建HTTP连接,获取响应,读取响应流,保存到本地文件。若需显示进度,可以使用`InputStreamReader`和`BufferedReader`配合`Handler`来更新UI。
```java
public void downloadImage(String imageUrl, String savePath, ProgressCallback callback) {
HttpURLConnection urlConnection = null;
try {
URL url = new URL(imageUrl);
urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.connect();
File outputFile = new File(savePath);
FileOutputStream fileOutputStream = new FileOutputStream(outputFile);
// 如果有回调函数,用于显示下载进度
if (callback != null) {
InputStream inputStream = urlConnection.getInputStream();
byte[] buffer = new byte[1024];
int bytesRead;
long totalBytesRead = 0;
while ((bytesRead = inputStream.read(buffer)) != -1) {
fileOutputStream.write(buffer, 0, bytesRead);
totalBytesRead += bytesRead;
callback.onProgressUpdate((int) (totalBytesRead * 100 / urlConnection.getContentLength()));
}
} else {
Files.copy(urlConnection.getInputStream(), Paths.get(savePath));
}
} catch (IOException e) {
// 处理异常
} finally {
if (urlConnection != null) {
urlConnection.disconnect();
}
}
}
```
这个方法中,如果提供了`ProgressCallback`,则在读取数据时更新进度,否则直接复制输入流到输出文件。
Android开发中使用HttpURLConnection进行网络请求需要关注请求方法、请求头、数据编码以及异常处理。对于图片下载,可以考虑是否需要展示下载进度,以便提供更好的用户体验。遵循这些最佳实践,可以确保在网络通信方面更加高效和稳定。
2020-05-20 上传
2016-11-07 上传
2014-04-29 上传
点击了解资源详情
187 浏览量
2022-06-06 上传
2017-03-09 上传
2022-03-27 上传
2012-01-26 上传
weixin_38739900
- 粉丝: 4
- 资源: 928