在android中,发送http请求的方式一般有两种,HttpURLConnection和HttpClient,下面先从HttpURLConnection说起:

一、HttpURLConnection:

要获取HttpURLConnection的实例,一般只需创建一个URL对象,传入目标网络地址,然后调用一下openConnection()方法即可,如下所示:


URL url = new URL("http://www.baidu.com");
HttpURLConnection connection = url.openConnection();


得到了HttpURLConnection的实例之后,我们需要考虑的就是使用什么样的方式进行http请求。常用的方式主要有两个,GET和POST,GET是希望从服务器获取数据而POST则表示提交数据给服务器,GET的安全性相比于POST要低,但是效率要比POST高,GET方式传送的数据量较小,不能大于2KB,POST传送的数据量较大一般默认为是不受限制的但最好不要大于80k。

建议:

1、get方式的安全性较Post方式要差些,包含机密信息的话,建议用Post数据提交方式;
	2、在做数据查询时,建议用Get方式;而在做数据添加、修改或删除时,建议用Post方式;
Http请求的写法如下:
connection.setRequestMethod("GET");
接下来就可以自由设置一下链接超时读取超时的毫秒数:
connection.setConnectionTimeOut(8000);
connection.setReadTimeOut(8000);
之后通过getInputStream()方法就可以获得发武器返回的输入流了,然后就可以对输入流进行读取显示。
InputStream input = connection.getInputStream();
最后不要忘了关闭Http链接,使用的方法是disconnection();
connection.disconnection();
HttpURLConnection方式完整代码如下:


package com.example.httpurlconnectiontest;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.content.Entity;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity implements OnClickListener{
	private TextView tv;
	private Button btn;
	private HttpURLConnection connection;
	private static final int SHOW = 1;
	private Handler handler = new Handler(){
		public void handleMessage(Message msg){
			switch(msg.what){
			case SHOW:
				String str = (String) msg.obj;
				tv.setText(str);
				break;
			}
		}
	};
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		tv = (TextView) findViewById(R.id.tv);
		btn = (Button) findViewById(R.id.btn);
		btn.setOnClickListener(this);
	}
	@Override
	public void onClick(View arg0) {
		switch(arg0.getId()){
		case R.id.btn:
			getUrlConnection();
			break;
		}
	}
	private void getUrlConnection() {
		//网络任务放在子线程中进行,子线程操作UI要发送消息到handler,由handler更改UI
		new Thread(new Runnable(){
			@Override
			public void run() {
				// TODO 自动生成的方法存根
				/*try {
					URL url = new URL("http://www.baidu.com");
					connection = (HttpURLConnection) url.openConnection();
					connection.setRequestMethod("GET");<span style="font-family: 'Microsoft YaHei', arial, 'courier new', courier, 宋体, monospace; white-space: pre-wrap;">//向服务器发送获取数据的请求,POST向服务器发送提交数据的请求,提交的数据必须是键值对,数据和数据之间用&隔开</span>
connection.setReadTimeout(8000);
					connection.setConnectTimeout(8000);
					InputStream in = connection.getInputStream();
					/**
					 * inputstream 字节流
					 * Reader字符流
					 * InputStreamReader 转换流,从字节流到字符流的桥梁
					 * BufferedReader 缓冲流
					 *//*
					BufferedReader reader = new BufferedReader(new InputStreamReader(in));
					StringBuilder builder = new StringBuilder();
					String line;
					while((line = reader.readLine())!=null){
						builder.append(line);
					}
					Message msg = new Message();
					msg.what = SHOW;
					msg.obj = builder.toString();
					handler.sendMessage(msg);
				} catch (Exception e) {
					// TODO 自动生成的 catch 块
					e.printStackTrace();
				}finally{
					if(connection != null){
						connection.disconnect();
					}
				}
			}
		}).start();
	}
}


下面再看HttpClient方式:

HttpClient是Apach提供的Http网络访问的一个接口,也包含在android的API中,可以完成和HttpURLConnection几乎一摸一样的效HttpClient是一个接口,我们无法创建它的实例,通常情况下我们会选择创建DefaultHttpClient的实例:
HttpClient httpClient = new DefaultGttpClient();
实例创建完成下面依然是考虑使用什么样的方式发送Http请求,和HttpURLConnection一样也是有GET、POST两种方式看一下GET方式,创建HttpGet对象,传入目标地址:
HttpGet httpGet = new HttpGet("http://www.baidu.com");
然后发送请求:
httpClient.execute(httpGet);
POST方式要稍微复杂一下,要先创建HttpPost对象然后通过NameValuePair集合来提交参数,并将参数集合传入到一个UrlcodeFormEntity中,然后调用HttpPost的setEntity()方法将构建好的UrlcodeFormEntity传入。
HttpPost  httppost  =  new HttpPost("http://www.baidu.com");
List<NameValuePair> params  =  new ArrayList<NameValuePair>();
params.add(new NameValuePair("name","admin"));
params.add(new NameValuePair("passWord","123456"));f
UrlcodeFromEntity entity = new UrlcodeFromEntity(entity,"utf-8");
httpPost.setEntity(entity);
httpClient.excute(httpPost);
发送完请求通常情况下我们会获取服务返回的状态码,如果状态码是200,则表示响应都成功了。
if(httpResponse.getStatusLine().getStatusCode()==200){
//解析数据
}
可以通过getEntity()方法来获取返回的HttpEntity实例然后再用EntityUtils.toString()就可以将获取到的HttpEntity转换成字符串了。
HttpEntity  entity  = httpResponse.getEntity();
package com.example.httpurlconnectiontest;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.content.Entity;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity implements OnClickListener{
	private TextView tv;
	private Button btn;
	private HttpURLConnection connection;
	private static final int SHOW = 1;
	private Handler handler = new Handler(){
		public void handleMessage(Message msg){
			switch(msg.what){
			case SHOW:
				String str = (String) msg.obj;
				tv.setText(str);
				break;
			}
		}
	};
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		tv = (TextView) findViewById(R.id.tv);
		btn = (Button) findViewById(R.id.btn);
		btn.setOnClickListener(this);
	}
	@Override
	public void onClick(View arg0) {
		switch(arg0.getId()){
		case R.id.btn:
			getUrlConnection();
			break;
		}
	}
	private void getUrlConnection() {
		//网络任务放在子线程中进行,子线程操作UI要发送消息到handler,由handler更改UI
		new Thread(new Runnable(){
			@Override
			public void run() {
				HttpClient httpClient = new DefaultHttpClient();
				HttpGet httpGet = new HttpGet("http://www.baidu.com");
				try {
					HttpResponse response = httpClient.execute(httpGet);
					HttpEntity entity = response.getEntity();
					String str = EntityUtils.toString(entity, "utf-8");
					Message msg = Message.obtain();
					msg.what = SHOW;
					msg.obj = str;
					handler.sendMessage(msg);
				} catch (ClientProtocolException e) {
					// TODO 自动生成的 catch 块
					e.printStackTrace();
				} catch (IOException e) {
					// TODO 自动生成的 catch 块
					e.printStackTrace();
				}
			}
		}).start();
	}
}