Android网络:HTTP之利用HttpURLConnection访问网页、获取网络图片实例 (附源码)

http://blog.csdn.net/yanzi1225627/article/details/22222735




一、提交数据

手机App向服务器提交数据原理与web页面向服务器提交数据的原理是一样的,都是依赖于Http协

议,只是使用的API不一样而已。

Android最常见的提交数据的类有3个:HttpURLConnection、HttpClient、AsyncHttpClient,它

们都分get和post两种提交方式其中HttpURLConnection是SDK自带的类;HttpClient本来是第3方开源

项目,不过被google纳入了SDK;AsyncHttpClient是一个使用起来特别简单的第3方开源项目,需要去

GitHub下载jar包。


我将6种不同的提交方式整合到了一起,App UI界面如下:


以下是6种不同方式提交数据的源代码:

1)URLGet方式

URLGet的特点就是直接将请求参数拼接到提交地址的后面

//1-以URLGet方式登陆publicvoidloginByURLGet(){newThread(){publicvoidrun(){//如果用户名和账号不为空if(checkEmpty()){//已经得到用户名密码,直接拿过来用就行了。StringservletPath="http://192.168.17.71/QQCenter/login";//拼接地址(*********重要步骤*************)StringurlPath=servletPath+"?username="+username+"&password="+password;try{//第1步:创建URLURLurl=newURL(urlPath);//第2步:创建HttpURLConnection连接HttpURLConnectionconn=(HttpURLConnection)url.openConnection();//第3步:设置请求参数conn.setRequestMethod("GET");conn.setConnectTimeout(5);//第4步:得到响应码intresponseCode=conn.getResponseCode();//第5步:判断响应码if(responseCode==200){//获取服务器端的返回信息InputStreamin=conn.getInputStream();Stringcontent=NetUtils.readStream(in);showToast(content);System.out.println("URLGet方式登陆");}else{showToast("服务器找不到资源");}}catch(Exceptione){e.printStackTrace();showToast("服务器忙!!!");}}}}.start();}

2)URLPost方式

URLPost的特点就是将提交的参数通过流写到服务器,相比URLGet方式,要多设两个头信

息,且设置向服务器写入流的权限。

publicvoidloginByURLPost(){newThread(){publicvoidrun(){//如果用户名和账号不为空if(checkEmpty()){//已经得到用户名密码,直接拿过来用就行了。StringservletPath="http://192.168.17.71/QQCenter/login";//要写入请求体的参数(*******关键步骤********)Stringdata="username="+username+"&password="+password;try{//第1步:创建URLURLurl=newURL(servletPath);//第2步:创建HttpURLConnection连接HttpURLConnectionconn=(HttpURLConnection)url.openConnection();//第3步:设置请求参数conn.setRequestMethod("POST");conn.setConnectTimeout(5);//注意设置两个请求头信息(*****关键步骤*****)conn.setRequestProperty("Content-Type","application/x-www-form-urlencoded");conn.setRequestProperty("Content-Length",data.length()+"");//设置向服务器写入流的权限(****关键步骤***)conn.setDoOutput(true);//得到输出流向服务器发送请求体数据(*****关键步骤******)OutputStreamout=conn.getOutputStream();out.write(data.getBytes());out.close();//第4步:得到响应码intresponseCode=conn.getResponseCode();//第5步:判断响应码if(responseCode==200){//获取服务器端的返回信息InputStreamin=conn.getInputStream();Stringcontent=NetUtils.readStream(in);showToast(content);in.close();System.out.println("以URLPost方式登陆");}else{showToast("服务器找不到资源");}}catch(Exceptione){e.printStackTrace();showToast("服务器忙!!!");}}}}.start();}

3)ClientGet方式

HttpClient这个类,相比HttpURLConnection语法上有很多的不同。将请求和响应单独封装

了一个类。获取服务器数据是经过多层包装的,需要先得到数据的实体HttpEntity,根据实体

再得到服务器的输出流。

android DefaultHttpClient 超时

http://blog.csdn.net/howlaa/article/details/17437463


publicvoidloginByClientGet(){newThread(){publicvoidrun(){//如果用户名和账号不为空if(checkEmpty()){//已经得到用户名密码,直接拿过来用就行了。StringservletPath="http://192.168.17.71/QQCenter/login";//拼接地址Stringdata="username="+username+"&password="+password;Stringurl=servletPath+"?"+data;try{//第1步:创建HttpClient对象HttpClientclient=newDefaultHttpClient();//第2步:创建get请求对象HttpGetget=newHttpGet(url);//第3步:执行get请求对象,得到response对象。HttpResponseresponse=client.execute(get);//第4步:得到响应码intresponseCode=response.getStatusLine().getStatusCode();//第5步:判断响应码if(responseCode==200){//获取服务器端的返回信息与URL不同,先获取的是数据实体。HttpEntityentity=response.getEntity();//从数据实体中得到服务的输出流InputStreamin=entity.getContent();Stringcontent=NetUtils.readStream(in);showToast(content);in.close();System.out.println("以ClientGet方式登陆");}else{showToast("服务器找不到资源");}}catch(Exceptione){e.printStackTrace();showToast("服务器忙!!!");}}}}.start();}

4)ClientPost方式

相对ClientGet方式,这种方式提交数据稍微有些复杂。创建post请求的实体数据时,要经

过多层包装。

publicvoidloginByClientPost(){newThread(){publicvoidrun(){//如果用户名和账号不为空if(checkEmpty()){//已经得到用户名密码,直接拿过来用就行了。StringservletPath="http://192.168.17.71/QQCenter/login";//请求体数据Stringdata="username="+username+"&password="+password;Stringurl=servletPath;try{//第1步:创建HttpClient对象HttpClientclient=newDefaultHttpClient();//第2步:创建post请求对象HttpPostpost=newHttpPost(url);//将请求参数封装到实体------过程稍微有点复杂List<NameValuePair>listPairs=newArrayList<NameValuePair>();//注意name的值与服务器应统一NameValuePairpair1=newBasicNameValuePair("username",username);NameValuePairpair2=newBasicNameValuePair("password",password);listPairs.add(pair1);listPairs.add(pair2);HttpEntitypostDataEntity=newUrlEncodedFormEntity(listPairs);post.setEntity(postDataEntity);//第3步:执行post请求HttpResponseresponse=client.execute(post);//第4步:得到状态码intstatusCode=response.getStatusLine().getStatusCode();//第5步:判断状态码if(statusCode==200){//得到数据的实体HttpEntityrespEntity=response.getEntity();//从实体得到流InputStreamin=respEntity.getContent();Stringcontent=NetUtils.readStream(in);showToast(content);in.close();System.out.println("以ClientPost方式登陆");}else{showToast("找不到资源");}}catch(Exceptione){e.printStackTrace();showToast("服务器忙!!!");}}};}.start();}

5)AsyncHttpClientGet方式

在使用这个类之前,去GitHub下载并导一下这个包com.loopj.android.http到项目的src目

录下。使用AsyncHttpClient还有一个十分爽的地方,就是这个类不需要使用在子线程中,那么

也就可以直接更新UI。请求地址就直接写servlet了,也不用拼接参数了,因为参数都写在了

RequestParams对象中去了。

publicvoidloginByAsyncHttpClientGet(){//如果用户名和账号不为空if(checkEmpty()){//已经得到用户名密码,直接拿过来用就行了。StringservletPath="http://192.168.1.109/QQCenter/login";try{AsyncHttpClientasyncHttpClient=newAsyncHttpClient();//创建get请求参数RequestParamsparams=newRequestParams();params.put("username",username);params.put("password",password);asyncHttpClient.get(getApplicationContext(),servletPath,params,newAsyncHttpResponseHandler(){//请求成功@OverridepublicvoidonSuccess(intstatusCode,Header[]headers,byte[]responseBody){if(statusCode==200){//得到服务器的返回值Stringcontent=newString(responseBody);Toast.makeText(getApplicationContext(),content,0).show();System.out.println("AsyncHttpClientGet方式登陆");}else{Toast.makeText(getApplicationContext(),"找不到资源",0).show();}}@OverridepublicvoidonFailure(intstatusCode,Header[]headers,byte[]responseBody,Throwableerror){//TODOAuto-generatedmethodstub}});}catch(Exceptione){e.printStackTrace();showToast("服务器忙!!!");}}}

6)AsyncHttpClientPost方式

和AsyncHttpClientGet方式相差无几,调用的是post方法。其它的一样

publicvoidloginByAsyncHttpClientPost(){//如果用户名和账号不为空if(checkEmpty()){//已经得到用户名密码,直接拿过来用就行了。StringservletPath="http://192.168.17.71/QQCenter/login";try{//创建AsyncHttpClient对象AsyncHttpClientasyncHttpClient=newAsyncHttpClient();RequestParamsparams=newRequestParams();params.put("username",username);params.put("password",password);asyncHttpClient.post(getApplicationContext(),servletPath,params,newAsyncHttpResponseHandler(){@OverridepublicvoidonSuccess(intstatusCode,Header[]headers,byte[]responseBody){if(statusCode==200){//得到服务器的返回值Stringcontent=newString(responseBody);Toast.makeText(getApplicationContext(),content,0).show();System.out.println("AsyncHttpClientPost方式登陆");}else{Toast.makeText(getApplicationContext(),"找不到资源",0).show();}}@OverridepublicvoidonFailure(intstatusCode,Header[]headers,byte[]responseBody,Throwableerror){}});}catch(Exceptione){e.printStackTrace();showToast("服务器忙!!!");}}}


提交数据的方式,这么多种,怎么使用呢?

HttpClient已被AsyncHttpClient所替代,一般开发都用后者。但是遇到特殊需求时,还是需要

用到最基础的HttpURLConnection,因为它可以设置请求头的参数信息。


二、提交数据时中文乱码问题

待进一步理解

更多相关文章

  1. 一句话锁定MySQL数据占用元凶
  2. Android(安卓)9.0 适配
  3. Android(安卓)MP4视频录制(思路篇,无DEMO)
  4. Android(安卓)USB设备通信--读写操作
  5. android cookie 使用
  6. Android(安卓)源码 图形系统之请求布局
  7. android sqlite database is locked (code 5): , while compilin
  8. Android(安卓)Application对象必须掌握的七点
  9. Flutter常用数据类型笔记

随机推荐

  1. Fabric 源码学习:如何实现批量管理远程服
  2. 只要两步,用Python将地址标记在地图上!
  3. Ansible 之 通过yum模块安装软件
  4. 如何面对人生中的逆境?
  5. 火了!开源的Python抢票神器,过年回家就看这
  6. 圣诞节,教你用Python给微信头像添加一个圣
  7. Python 3.9 新特性:任意表达式可作为装饰
  8. 放大招!耗时一个月,早起做了一个Python数据
  9. 这本面试小册,小鹿终于肝熬出来了!
  10. 我用三年的青春,写下了这 230+篇原创文章!