Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android中如何使用HttpURLConnection實現GET POST JSON數據與下載圖片

Android中如何使用HttpURLConnection實現GET POST JSON數據與下載圖片

編輯:關於Android編程

Android中使用HttpURLConnection實現GET POST JSON數據與下載圖片

Android6.0中把Apache HTTP Client所有的包與類都標記為deprecated不再建議使用

所有跟HTTP相關的數據請求與提交操作都通過HttpURLConnection類實現,現實是

很多Android開發者一直都Apache HTTP Client來做andoird客戶端與後台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 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 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 {
	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,然後在後台服務器對應的API

中解碼為UTF-8,不然就會報錯HTTP 400。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved