HttpClient在Android网络通信中的应用
2015-11-14 20:51
423 查看
HttpClient在Android网络通信中的应用—HttpClient传递参数给服务器。
HttpClient在Android网络通信中的应用HttpClient传递参数给服务器HttpClient的介绍
步骤简介
源码分析
HttpClientjava
doPost方法
doGet方法
Registjava
注意事项
HttpClient的介绍
HTTP 协议可能是现在 Internet 上使用得最多、最重要的协议了,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源。虽然在 JDK 的 java net包中已经提供了访问 HTTP 协议的基本功能,但是对于大部分应用程序来说,JDK 库本身提供的功能还不够丰富和灵活。HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。HttpClient 已经应用在很多的项目中,比如 Apache Jakarta 上很著名的另外两个开源项目 Cactus 和 HTMLUnit 都使用了 HttpClient。现在HttpClient最新版本为 HttpClient 4.5 (GA) (2015-09-11)HttpClient的介绍
步骤简介
1)、后台程序用Eclipse for JavaEE完成,具体就是一个姓名,年龄,密码的表单传递和后台处理。2)、客户端方面创建HttpClientThread继承Thread类来完成网络线程的操作,如果Eclipse没有集成HttpClient功能,那么就必须在libs文件下导入相关架包,架包已经上传,下载地址如下:httpclient-4.2.5.jar
3)、新建登陆布局Xml文件regist.xml和登录用的RegistActivity,在RegistActivity中关联regist.xml,接着在RegistActivity中新建并调用HttpClient线程,实现传参功能。
源码分析
HttpClient.java
doPost方法
1)、重写构造方法2)、新建一个HttpClinent对象,名为client。
3)、将数据存储在动态数组 ArrayList<>里面,动态数组里面存储着NameValuePair,这是一个用于表单数据存储的特殊类。
4)、将动态数组存储在Post里面,Post也可以理解成一个容器。
5)、将Post利用client的execute方法传递给服务器,这样就把数据发送给服务器了。
6)、判断服务器返回的结果码getStatusCode是不是有问题,没有问题就把返回的内容也就是content打印到客户端的控制上。
doGet方法
1)、将数据存储在动态数组url里面,这一步在Activity里面实现。2)、重写构造方法
3)、新建一个HttpGet对象,就叫httpGet,将url传入。
4)、新建一个HttpClinent对象,名为client。
5)、使用client的execute方法,把httpGet传入,间接的将url传入,这样就把数据发送给服务器了。
6)、判断服务器返回的结果码getStatusCode是不是有问题,没有问题就把返回的内容也就是content打印到客户端的控制上。
包含了HttpClient的doPost方法doGet方法
package com.example.http_01; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.util.ArrayList; import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; import org.apache.http.NameValuePair; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.HttpClient; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.message.BasicNameValuePair; import org.apache.http.util.EntityUtils; //通过使用HttpClient来完成对服务器的数据传输和下载 public class HttpClientThread extends Thread { private String url; //这个构造方法是doGet的,只需要传递url。实体数据包含在url里面传递给了服务器。 /*doGet方法 2)*/ public HttpClientThread(String url){ this.url=url; } private String name; private String age; private String Password; //这个构造方法是doPost的,需要传递实体数据。 /*doPost方法 1)*/ public HttpClientThread(String url,String name,String age,String Password){ this.url = url; this.name = name; this.age = age; this.Password = Password; } private void doHttpClientPost(){ //因为所有的数据发送都是通过HttpClinent所以我们要创建一个HttpClinent类 /*doPost方法 2)*/ HttpClient client = new DefaultHttpClient(); //因为是用ClientPost所以要创建一个HttpPost类,把URL传进来。 HttpPost post = new HttpPost(url); /*doPost方法 3)*/ //创建一个ArrayList来存储传向服务器的参数,NameValuePair是HttpClient项目里面的一个类,用于FORM数据存储的。 ArrayList<NameValuePair>list=new ArrayList<NameValuePair>(); try { list.add(new BasicNameValuePair("name", URLEncoder.encode(name,"utf-8"))); } catch (UnsupportedEncodingException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } list.add(new BasicNameValuePair("age", age)); list.add(new BasicNameValuePair("Password", Password)); /*doPost方法 4)*/ //将list(ArrayList)传进setEntity,然后通过client.execute把list post给服务器 /*doPost方法 5)*/ try { post.setEntity(new UrlEncodedFormEntity(list)); HttpResponse response = client.execute(post); //判断服务器返回的结果码getStatusCode是不是有问题, /*doPost方法 6)*/ if(response.getStatusLine().getStatusCode()==HttpStatus.SC_OK){ String Content = EntityUtils.toString(response.getEntity()); System.out.println("Content-------->"+Content); } } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ClientProtocolException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } //利用HttpClient的Get方式向服务器发送请求,对应的构造方法只用传一个url参就可以了。 private void dohttpClientGet(){ /*doGet方法 3)*/ HttpGet httpGet=new HttpGet(url); //因为所有的数据发送都是通过HttpClinent所以我们要创建一个HttpClinent类 /*doGet方法 4)*/ HttpClient client = new DefaultHttpClient(); //得到一个响应对象 HttpResponse response; try { /*doGet方法 5)*/ response = client.execute(httpGet); //拿到response对象之后,如果服务器返回的结果码是没有问题的,我们就可以拿到服务器返回给我们的数据。服务器返回给我们的数据储存在content里面。 /*doGet方法 6)*/ if(response.getStatusLine().getStatusCode()==HttpStatus.SC_OK){ String content = EntityUtils.toString(response.getEntity()); //打印拿到的数据 System.out.println("content-------->"+content); } } catch (ClientProtocolException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Override public void run() { // TODO Auto-generated method stub //选择调用doGet方法或者doPost方法,注释掉不用的哪一个。 dohttpClientGet(); //doHttpClientPost(); } }
Regist.java
package com.example.http_01; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.view.View.OnClickListener; public class RegistActivity extends Activity { private EditText name; private EditText age; private EditText Password; private Button regist; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.regist); name = (EditText) findViewById(R.id.EditText_name); age = (EditText) findViewById(R.id.EditText_age); Password = (EditText) findViewById(R.id.EditText_Password); regist = (Button) findViewById(R.id.regist); regist.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub String url = "http://192.168.1.104:8080/web/MyServlet"; /*********************************************************/ /*通过dohttpClientGet()方法传参*/ try { /*doGet方法 1)*/ url=url+"?name="+URLEncoder.encode((name.getText().toString()),"utf-8")+"&age="+age.getText().toString()+"&Password="+Password.getText().toString(); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } new HttpClientThread(url).start(); /********************************************************/ 两种方法需要注释其中一个 /*通过doHttpClientPost()方法传参。*/ /* new HttpClientThread(url,name.getText().toString(),age.getText().toString(),Password.getText().toString()).start();*/ } }); } }
regist.xml
“`
注意事项
1)、使用Android Studio编写Android网络通信部分的代码时,可能没有HttpClient的架包,需要我们自己导入。2)、注意填写url传入的IP,一般是电脑主机的IP。真机调试需要手机和电脑接入同一个网络。
3)、记得加网络访问的权限
4)、new Thread类,都必须调用start方法,否则不能运用。
相关文章推荐
- 10010---JavaWeb基础--HttpServlet
- MOOC课程作业http://mooc.study.163.com/course/USTC-1000002006
- iOS9的网络请求简述
- “App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. T
- Android网络优化3--基本方法
- Tinyhttpd源码剖析(二)
- 简单的网络编程--服务器,客户端呼应
- Tinyhttpd源码剖析(一)
- CentOS7 最小化安装后,安装配置并启动httpd的步骤
- Ubuntu 桌面设置之网络环境的设置
- Ubuntu通过修改配置文件进行网络配置
- android 获取手机上面的IMSI序列号,IMEI,MAC地址,IP地址,当前时间,当前经纬度,获取网络类型
- java快速教程-http://www.cnblogs.com/vamei/archive/2013/03/31/2991531.html
- 黑马程序员——网络编程(一)
- 映射网络盘
- Http些许己见
- 网络设备将网口切换到业务板以后为什么会报各种不正确的信息?
- Android网络优化2--HttpClinet
- cenos7.1 安装openstack kilo 心得之三添加网络时间协议
- Android网络优化1--Native Socket