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