Android中使用HttpURLConnection实现GET POST JSON数据与下载图片
Android6.0中把ApacheHTTPClient所有的包与类都标记为deprecated不再建议使用所有跟HTTP相关的数据请求与提交操作都通过HttpURLConnection类实现,现实是很多Android开发者一直都ApacheHTTPClient来做andoird客户端与后台HTTP接口数据交互,小编刚刚用HttpURLConnection做了一个android的APP,不小心踩到了几个坑,总结下最常用的就通过HttpURLConnection来POST提交JSON数据与GET请求JSON数据。此外就是下载图片,下载图片分为显示进度与不显示进度两种。其中提交数据的时候涉及中文一定要先把中文转码成utf-8之后在POST提交,否则就会一直遇到HTTP400的错误。
一、GET请求JSON数据的例子
publicUserDtoexecute(String...params){
InputStreaminputStream=null;
HttpURLConnectionurlConnection=null;
try{
//readresponseURLEncoder.encode(para,"GBK");
StringurlWithParams=DOMAIN_ADDRESS+MEMBER_REQUEST_TOKEN_URL+"?userName="+java.net.URLEncoder.encode(params[0],"utf-8")+"&password="+params[1];
URLurl=newURL(urlWithParams);
urlConnection=(HttpURLConnection)url.openConnection();
/*optionalrequestheader*/
urlConnection.setRequestProperty("Content-Type","application/json;charset=UTF-8");
/*optionalrequestheader*/
urlConnection.setRequestProperty("Accept","application/json");
/*forGetrequest*/
urlConnection.setRequestMethod("GET");
intstatusCode=urlConnection.getResponseCode();
/*200representsHTTPOK*/
if(statusCode==200){
inputStream=newBufferedInputStream(urlConnection.getInputStream());
Stringresponse=HttpUtil.convertInputStreamToString(inputStream);
Gsongson=newGson();
UserDtodto=gson.fromJson(response,UserDto.class);
if(dto!=null&&dto.getToken()!=null){
Log.i("token","findthetoken="+dto.getToken());
}
returndto;
}
}catch(Exceptione){
e.printStackTrace();
}finally{
if(inputStream!=null){
try{
inputStream.close();
}catch(IOExceptione){
e.printStackTrace();
}
}
if(urlConnection!=null){
urlConnection.disconnect();
}
}
returnnull;
}
二、POST提交JSON数据
publicMap<String,String>execute(NotificationDtodto){
InputStreaminputStream=null;
HttpURLConnectionurlConnection=null;
try{
URLurl=newURL(getUrl);
urlConnection=(HttpURLConnection)url.openConnection();
/*optionalrequestheader*/
urlConnection.setRequestProperty("Content-Type","application/json;charset=UTF-8");
/*optionalrequestheader*/
urlConnection.setRequestProperty("Accept","application/json");
dto.setCreator(java.net.URLEncoder.encode(dto.getCreator(),"utf-8"));
//readresponse
/*forGetrequest*/
urlConnection.setRequestMethod("POST");
urlConnection.setDoOutput(true);
DataOutputStreamwr=newDataOutputStream(urlConnection.getOutputStream());
Gsongson=newGson();
StringjsonString=gson.toJson(dto);
wr.writeBytes(jsonString);
wr.flush();
wr.close();
//trytogetresponse
intstatusCode=urlConnection.getResponseCode();
if(statusCode==200){
inputStream=newBufferedInputStream(urlConnection.getInputStream());
Stringresponse=HttpUtil.convertInputStreamToString(inputStream);
Map<String,String>resultMap=gson.fromJson(response,Map.class);
if(resultMap!=null&&resultMap.size()>0){
Log.i("applyDesigner","pleasecheckthemapwithkey");
}
returnresultMap;
}
}
catch(Exceptione)
{
e.printStackTrace();
}
finally
{
if(inputStream!=null){
try{
inputStream.close();
}catch(IOExceptione){
e.printStackTrace();
}
}
if(urlConnection!=null){
urlConnection.disconnect();
}
}
returnnull;
}
三、下载图片显示下载进度
packagecom.example.demo;
importjava.io.ByteArrayInputStream;
importjava.io.ByteArrayOutputStream;
importjava.io.IOException;
importjava.io.InputStream;
importjava.net.HttpURLConnection;
importjava.net.URL;
importandroid.graphics.Bitmap;
importandroid.graphics.BitmapFactory;
importandroid.os.AsyncTask;
importandroid.os.Handler;
importandroid.os.Message;
importandroid.util.Log;
publicclassImageLoadTaskextendsAsyncTask<String,Void,Bitmap>{
privateHandlerhandler;
publicImageLoadTask(Handlerhandler){
this.handler=handler;
}
protectedvoidonPostExecute(Bitmapresult){
Messagemsg=newMessage();
msg.obj=result;
handler.sendMessage(msg);
}
protectedBitmapdoInBackground(String...getUrls){
InputStreaminputStream=null;
HttpURLConnectionurlConnection=null;
try{
//openconnection
URLurl=newURL(getUrls[0]);
urlConnection=(HttpURLConnection)url.openConnection();
/*forGetrequest*/
urlConnection.setRequestMethod("GET");
intfileLength=urlConnection.getContentLength();
intstatusCode=urlConnection.getResponseCode();
if(statusCode==200){
inputStream=urlConnection.getInputStream();
bytedata[]=newbyte[4096];
longtotal=0;
intcount;
ByteArrayOutputStreamoutput=newByteArrayOutputStream();
while((count=inputStream.read(data))!=-1){
total+=count;
//publishingtheprogress....
if(fileLength>0&&handler!=null){
handler.sendEmptyMessage(((int)(total*100/fileLength))-1);
}
output.write(data,0,count);
}
ByteArrayInputStreambufferInput=newByteArrayInputStream(output.toByteArray());
Bitmapbitmap=BitmapFactory.decodeStream(bufferInput);
inputStream.close();
bufferInput.close();
output.close();
Log.i("image","alreadygettheimagebyuuid:"+getUrls[0]);
handler.sendEmptyMessage(100);
returnbitmap;
}
}catch(Exceptione){
e.printStackTrace();
}finally{
if(inputStream!=null){
try{
inputStream.close();
}catch(IOExceptione){
e.printStackTrace();
}
}
if(urlConnection!=null){
urlConnection.disconnect();
}
}
returnnull;
}
}
总结:使用HttpURLConnection提交JSON数据的时候编码方式为UTF-8所有中文字符请一定要预先转码为UTF-8,然后在后台服务器对应的API中解码为UTF-8,不然就会报错HTTP400。
以上就是本文的全部内容,希望对大家的学习Android软件编程有所帮助。