Android HttpURLConnection实战:GET/POST JSON与图片下载

5 下载量 77 浏览量 更新于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进行网络请求需要关注请求方法、请求头、数据编码以及异常处理。对于图片下载,可以考虑是否需要展示下载进度,以便提供更好的用户体验。遵循这些最佳实践,可以确保在网络通信方面更加高效和稳定。