Android中使用HttpURLConnection實現GET POST JSON數據與下載圖片
Android6.0中把Apache HTTP Client全部的包與類都標記為deprecated不再建議使用
全部跟HTTP相關的數據請求與提交操作都通過HttpURLConnection類實現,現實是
非常多Android開發人員一直都Apache HTTP Client來做andoirdclient與后台HTTP接口數
據交互,本人剛剛用HttpURLConnection做了一個android的APP。不小心踩到了幾個
坑,總結下最經常使用的就通過HttpURLConnection來POST提交JSON數據與GET請求
JSON數據。此外就是下載圖片,下載圖片分為顯示運行進度與不顯示運行進度兩種。
當中提交
數據的時候涉及中文一定要先把中文轉碼成utf-8之后在POST提交,否則就會一直遇到
HTTP 400的錯誤。
一:GET請求JSON數據的樣例
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數據
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;
}
}
總結:使用HttpURLConnection提交JSON數據的時候編碼方式為UTF-8
全部中文字符請一定要預先轉碼為UTF-8,然后在后台server相應的API
中解碼為UTF-8,不然就會報錯HTTP 400。
