欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android中使用HttpURLConnection实现GET POST JSON数据与下载图片

程序员文章站 2024-02-15 10:21:22
android6.0中把apache http client所有的包与类都标记为deprecated不再建议使用所有跟http相关的数据请求与提交操作都通过httpurlc...

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软件编程有所帮助。