在Android上发送HTTP请求的方式一般有两种,HttpURLConnection和HttpClient。
1、HttpURLConnection:
首先需要获取HttpURLConnection的实例,一般只需要new一个URL对象并传入目标的网络地址,让背后调用openConnection()方法即可:
URL url=new URL("http://www.baidu.com");
HttpURLConnection conn=(HttpURLConnection)url.openConnection();
设置HTTP请求使用的方法,常用的方法主要有两个:GET和POST。
conn.setRequestMethod("GET");
设置连接超时毫秒数
conn.setConnectionTimeout(5000);
设置读取超时毫秒数
conn.setReadTimeout(5000);
之后调用getInputStream()方法就可以获取到服务器返回的输入流了
InputStream in=conn.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
StringBuffer stringBuffer = new StringBuffer();
String line;
while ((line = reader.readLine()) != null) {
stringBuffer.append(line);
}
Log.d("TAG",stringBuffer.toString());
关闭HTTP连接
conn.disconnect();
如果是想提交数据给服务器,之需要将HTTP请求的方法改为POST,并在获取输入流之前把要提交的数据写出即可,注意每条数据都要以键值对的形式存在,数据与数据之间用&符号隔开:
conn.setRequestMethod("POST");
DataOutputStream out=new DataOutputStream(conn.getOutputStream());
out.writeBytes("username=admin&password=123456");
2、HttpClient
HttpClient可以完成和HttpURLConnection几乎一模一样的功能,但两者的用法却有较大的差别。
HttpClient是一个接口,因此无法创建它的实例,通常情况下会创建一个DefaultHttpClient的实例:
HttpClient httpClient=new DefaultHttpClient();
如果想要发起一条GET请求,可以创建一个HttpGet对象,并传入目标的网络地址,然后调用HttpClient的execute()方法即可:
HttpGet httpGet=new HttpGet("http://www.taobao.com");
HttpResponse httpResponse=httpClient.execute(httpGet);
如果是POST请求,胡比GET请求稍微复杂一点,我们需要创建一个HttpPost对象,并传入目标的网络地址:
HttpPOST httpPost=new HttpPost("http://www.taobao.com");
然后通过一个NameValuePair集合存放待提交的参数,并将这个参数集合传入到一个UrlEncodedFormEntity中,然后调用HttpPost的setEntity()方法将构建好的UrlEncodedFormEntity传入:
List<NameValuePair> params=new ArrayList<NameValuePair>();
params.add(new NameValuePair("username","admin"));
params.add(new NameValuePair("password","123456"));
UrlEncodedFormEntity entity=new UrlEncodedFormEntity(params,"utf-8");
httpPost.setEntity(entity);
接下来的操作和HttpGet一样了,调用HttpClient的execute()方法,并将HttpPost对象传入即可:
HttpResponse httpResponse=httpClient.execute(httpPost);
执行excute()方法后会返回一个HttpResponse对象,服务器返回的信息就会包含在里面,通常情况下,我们都会先去除服务器返回的状态码,如果等于200就说明请求和相应都成功了。
if(httpResponse.getStatusLine().getStatusCode()==200){
//请求和相应都成功了
}
接下来在这个if判断的内部取出服务器的具体内容,可以调用getEntity()方法获得到一个HttpEntity实例,然后再调用EntityUtils.toString()方法将HttpEntity转换成字符串即可:
HttpEntity entity=httpResponse.getEntity();
String response=EntityUtils.toString(entity);
如果返回的数据中带有中文,需要指定字符编码集为utf-8,否则会出现乱码:
String str=EntityUtils.toString(entity,"utf-8");