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

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

編輯:關於Android編程

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<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,然後在後台服務器對應的API中解碼為UTF-8,不然就會報錯HTTP 400。

以上就是本文的全部內容,希望對大家的學習Android軟件編程有所幫助。

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