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线程,实现传参功能。
1)、重写构造方法
2)、新建一个HttpClinent对象,名为client。
3)、将数据存储在动态数组 ArrayList<>里面,动态数组里面存储着NameValuePair,这是一个用于表单数据存储的特殊类。
4)、将动态数组存储在Post里面,Post也可以理解成一个容器。
5)、将Post利用client的execute方法传递给服务器,这样就把数据发送给服务器了。
6)、判断服务器返回的结果码getStatusCode是不是有问题,没有问题就把返回的内容也就是content打印到客户端的控制上。
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();
}
}
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方法,否则不能运用。