Android中使用HttpURLConnection實現(xiàn)GET POST JSON數(shù)據(jù)與下載圖片
Android6.0中把Apache HTTP Client所有的包與類都標(biāo)記為deprecated不再建議使用所有跟HTTP相關(guān)的數(shù)據(jù)請求與提交操作都通過HttpURLConnection類實現(xiàn),現(xiàn)實是很多Android開發(fā)者一直都Apache HTTP Client來做andoird客戶端與后臺HTTP接口數(shù)據(jù)交互,小編剛剛用HttpURLConnection做了一個android的APP,不小心踩到了幾個坑,總結(jié)下最常用的就通過HttpURLConnection來POST提交JSON數(shù)據(jù)與GET請求JSON數(shù)據(jù)。此外就是下載圖片,下載圖片分為顯示進度與不顯示進度兩種。其中提交數(shù)據(jù)的時候涉及中文一定要先把中文轉(zhuǎn)碼成utf-8之后在POST提交,否則就會一直遇到HTTP 400的錯誤。
一、GET請求JSON數(shù)據(jù)的例子
public UserDto execute(String... params) { InputStream inputStream = null; HttpURLConnection urlConnection = null; try { // read responseURLEncoder.encode(para, "GBK"); 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(); /* optional request header */ urlConnection.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); /* optional request header */ urlConnection.setRequestProperty("Accept", "application/json"); /* for Get request */ urlConnection.setRequestMethod("GET"); int statusCode = urlConnection.getResponseCode(); /* 200 represents HTTP OK */ if (statusCode == 200) { inputStream = new BufferedInputStream(urlConnection.getInputStream()); String response = HttpUtil.convertInputStreamToString(inputStream); Gson gson = new Gson(); UserDto dto = gson.fromJson(response, UserDto.class); if (dto != null && dto.getToken() != null) { Log.i("token", "find the token = " + dto.getToken()); } return dto; } } catch (Exception e) { e.printStackTrace(); } finally { if (inputStream != null) { try { inputStream.close(); } catch (IOException e) { e.printStackTrace(); } } if (urlConnection != null) { urlConnection.disconnect(); } } return null; }
二、POST提交JSON數(shù)據(jù)
public Map<String, String> execute(NotificationDto dto) { InputStream inputStream = null; HttpURLConnection urlConnection = null; try { URL url = new URL(getUrl); urlConnection = (HttpURLConnection) url.openConnection(); /* optional request header */ urlConnection.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); /* optional request header */ urlConnection.setRequestProperty("Accept", "application/json"); dto.setCreator(java.net.URLEncoder.encode(dto.getCreator(), "utf-8")); // read response /* for Get request */ urlConnection.setRequestMethod("POST"); urlConnection.setDoOutput(true); DataOutputStream wr = new DataOutputStream(urlConnection.getOutputStream()); Gson gson = new Gson(); String jsonString = gson.toJson(dto); wr.writeBytes(jsonString); wr.flush(); wr.close(); // try to get response int statusCode = urlConnection.getResponseCode(); if (statusCode == 200) { inputStream = new BufferedInputStream(urlConnection.getInputStream()); String response = HttpUtil.convertInputStreamToString(inputStream); Map<String, String> resultMap = gson.fromJson(response, Map.class); if (resultMap != null && resultMap.size() > 0) { Log.i("applyDesigner", "please check the map with key"); } return resultMap; } } catch(Exception e) { e.printStackTrace(); } finally { if (inputStream != null) { try { inputStream.close(); } catch (IOException e) { e.printStackTrace(); } } if (urlConnection != null) { urlConnection.disconnect(); } } return null; }
三、下載圖片顯示下載進度
package com.example.demo; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.AsyncTask; import android.os.Handler; import android.os.Message; import android.util.Log; public class ImageLoadTask extends AsyncTask<String, Void, Bitmap> { private Handler handler; public ImageLoadTask(Handler handler) { this.handler = handler; } protected void onPostExecute(Bitmap result) { Message msg = new Message(); msg.obj = result; handler.sendMessage(msg); } protected Bitmap doInBackground(String... getUrls) { InputStream inputStream = null; HttpURLConnection urlConnection = null; try { // open connection URL url = new URL(getUrls[0]); urlConnection = (HttpURLConnection) url.openConnection(); /* for Get request */ urlConnection.setRequestMethod("GET"); int fileLength = urlConnection.getContentLength(); int statusCode = urlConnection.getResponseCode(); if (statusCode == 200) { inputStream = urlConnection.getInputStream(); byte data[] = new byte[4096]; long total = 0; int count; ByteArrayOutputStream output = new ByteArrayOutputStream(); while ((count = inputStream.read(data)) != -1) { total += count; // publishing the progress.... if (fileLength > 0 && handler != null) { handler.sendEmptyMessage(((int) (total * 100 / fileLength)) - 1); } output.write(data, 0, count); } ByteArrayInputStream bufferInput = new ByteArrayInputStream(output.toByteArray()); Bitmap bitmap = BitmapFactory.decodeStream(bufferInput); inputStream.close(); bufferInput.close(); output.close(); Log.i("image", "already get the image by uuid : " + getUrls[0]); handler.sendEmptyMessage(100); return bitmap; } } catch (Exception e) { e.printStackTrace(); } finally { if (inputStream != null) { try { inputStream.close(); } catch (IOException e) { e.printStackTrace(); } } if (urlConnection != null) { urlConnection.disconnect(); } } return null; } }
總結(jié):使用HttpURLConnection提交JSON數(shù)據(jù)的時候編碼方式為UTF-8所有中文字符請一定要預(yù)先轉(zhuǎn)碼為UTF-8,然后在后臺服務(wù)器對應(yīng)的API中解碼為UTF-8,不然就會報錯HTTP 400。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)Android軟件編程有所幫助。
相關(guān)文章
Kotlin中l(wèi)et()with()run()apply()also()函數(shù)的使用方法與區(qū)別
在Kotlin中的源碼標(biāo)準(zhǔn)庫(Standard.kt)中提供了一些Kotlin擴展的內(nèi)置函數(shù)可以優(yōu)化kotlin的編碼,今天為大家聊聊let,with,run,apply,also幾個函數(shù)的用法與區(qū)別2018-03-03AndroidStudio實現(xiàn)能在圖片上涂鴉程序
這篇文章主要為大家詳細(xì)介紹了AndroidStudio實現(xiàn)能在圖片上涂鴉程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-05-05Android Studio 3.6中新的視圖綁定工具ViewBinding 用法詳解
這篇文章主要介紹了Android Studio 3.6中新的視圖綁定工具ViewBinding 用法,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-03-03Android仿微信發(fā)表說說實現(xiàn)拍照、多圖上傳功能
這篇文章主要為大家詳細(xì)介紹了Android仿微信發(fā)表說說實現(xiàn)拍照、多圖上傳功能,使用Retrofit2.0技術(shù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-03-03