HttpClient简介
HTTP 协议可能是现在 Internet 上使用得最多、最重要的协议了,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源。虽然在 JDK 的 java.net 包中已经提供了访问 HTTP 协议的基本功能,但是对于大部分应用程序来说,JDK 库本身提供的功能还不够丰富和灵活。HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。HttpClient 已经应用在很多的项目中,比如 Apache Jakarta 上很著名的另外两个开源项目 Cactus 和 HTMLUnit 都使用了 HttpClient。
HttpClient使用步骤如下
1.创建HttpClient对象
2.如果需要发送GET请求,则创建HttpGet对象;如果需要发送POST请求,则创建HttpPost对象。
3.对于HttpPost对象而言,也可调用setEntity(HttpEntity entity)方法来设置请求参数
4.调用HttpClient对象的execute()方法发送请求,执行该方法返回一个HttpResponse。
5.调用HttpResponse的getAllHeader()、getHeaders(String name)等方法可获取服务器的响应头;调用HttpResponse的getEntity()方法可获取HttpEntity对象,该对象包装了服务器的响应内容;程序可通过该对象获取服务器的响应内容。
如下实现一个简单的httpget请求方式的代码
public void requestweather(View v){
new Thread(){
public void run() {
//1.创建出一个HttpClient
HttpClient hc=new DefaultHttpClient();
//2.创建HttpGet对象
try {
//对参数进行编码
String citydata=URLEncoder.encode("北京", "utf-8");
HttpGet hg=new HttpGet("http://v.juhe.cn/weather/index?cityname="+citydata+"&dtype=&format=&key=d518c53e9f8bd40ba1784ca8448223b8");
//3.执行请求
HttpResponse response = hc.execute(hg);
//4.得到结果码,并判断
int code=response.getStatusLine().getStatusCode();
if(code==200){
//5.得到结果数据
HttpEntity result = response.getEntity();
//将HttpEntity转换成String字符串
String content=EntityUtils.toString(result);
Log.d("zzz", 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();
}
};
}.start();
如下实现一个简单的httppost请求方式的代码:
public class MainActivity extends Activity {
private List<Weixin> lists;
private Handler myHandler=new Handler(){
public void handleMessage(android.os.Message msg) {
//接收数据
lists=(List<Weixin>) msg.obj;
//更新listview
MyAdapter adapter=new MyAdapter();
lv.setAdapter(adapter);
};
};
private ListView lv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv = (ListView) findViewById(R.id.lv);
}
class MyAdapter extends BaseAdapter{
@Override
public int getCount() {
// TODO Auto-generated method stub
return lists.size();
}
@Override
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public long getItemId(int arg0) {
// TODO Auto-generated method stub
return 0;
}
@Override
public View getView(int arg0, View arg1, ViewGroup arg2) {
arg1=View.inflate(MainActivity.this, R.layout.item, null);
TextView tvS=(TextView) arg1.findViewById(R.id.tv_source);
TextView tvT=(TextView) arg1.findViewById(R.id.tv_title);
tvS.setText(lists.get(arg0).getSource());
tvT.setText(lists.get(arg0).getTitle());
return arg1;
}
}
public void requestdata(View v){
//1.开启子线程
new Thread(){
public void run() {
//1.创建httpclient对象
HttpClient hc=new DefaultHttpClient();
//2.使用post请求,HttpPost get,HttpGet,需要添加请求的网址
HttpPost hp=new HttpPost("http://v.juhe.cn/weixin/query");
//将请求的参数放到此集合对象中
List<BasicNameValuePair> parameters=new ArrayList<BasicNameValuePair>();
//BasicNameValuePair:键值对
parameters.add(new BasicNameValuePair("key", "88f7bbc507e3ecacfaeab2b47dd8936f"));
parameters.add(new BasicNameValuePair("pno", "1"));
parameters.add(new BasicNameValuePair("ps", "10"));
parameters.add(new BasicNameValuePair("pno", "1"));
parameters.add(new BasicNameValuePair("dtype", "json"));
//3.设置参数数据 HttpEntity是接口
HttpEntity entity;
try {
entity = new UrlEncodedFormEntity(parameters, "utf-8");
hp.setEntity(entity);
//4.执行请求
HttpResponse response = hc.execute(hp);
//5.得到结果码,判断
int code=response.getStatusLine().getStatusCode();
if(code==200){
//6.获得结果
HttpEntity result = response.getEntity();
String content=EntityUtils.toString(result);
Log.d("zzz", content);
//进行解析
Gson gs=new Gson();
Result weixinResult=gs.fromJson(content, Result.class);
//发送消息,更新界面
Message msg=Message.obtain();
msg.obj=weixinResult.getResult().getList();
myHandler.sendMessage(msg);
}
} 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();
}
};
}.start();
}
}