在Android上发送 HTTP 请求的方式一般有两种, HttpURLConnection 和 HttpClient,关于HttpURLConnection的用法可以参考 HTTP之利用HttpURLConnection访问网页,这里只介绍HttpClient发送POST与GET请求的用法。
HttpClient 是 Apache 提供的 HTTP 网络访问接口, 使用需要注意以下几点:
首先看下发送GET请求:
1.声明一下网络权限,修改AndroidManifest.xml中的代码:
<uses-permission android:name="android.permission.INTERNET" />
2.HttpClient 是一个接口,因此无法创建它的实例, 通常情况下都会创建一个 DefaultHttpClient 的实例
HttpClient httpClient = new DefaultHttpClient();
3.创建一个 HttpGet 对象,并传入目标的网络地址, 然后调用 HttpClient 的 execute()方法即可:
HttpGet httpGet = new HttpGet("http://www.baidu.com");
httpClient.execute(httpGet);
4.执行execute()方法之后会返回一个HttpResponse对象, 服务器所返回的所有信息就会包含在这里面, 因此我们可以实例化一个HttpResponse对象来接收execute()方法返回的结果:
HttpResponse response = httpClient.execute(httpGet);
5.判断服务器返回的状态码,如果等于 200就说明请求和响应都成功了:
if(httpResponse.getStatusLine().getStatusCode() == 200) {
// 请求和响应都成功了
}
6.在上面的if判断里面调用getEntity()方法获取到一个HttpEntity实例,然后再用EntityUtils.toString()这个静态方法将 HttpEntity 转换成字符串即可获取:
if(httpResponse.getStatusLine().getStatusCode() == 200) {
HttpEntity entity = response.getEntity();
String content = EntityUtils.toString(entity);
}
下面以一个例子获取一个ip的归属地和运营商(结合了解析JSON,Handler异步更新机制,HttpClient发送GET请求),这里直接给出MianActivity中的代码如下:
package com.example.androidstudyhttpclient;
import java.io.IOException;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
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 org.json.JSONException;
import org.json.JSONObject;
import com.example.androidstudypostget.R;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends Activity implements OnClickListener{
protected static final int SHOW_RESPONSE = 0;
private TextView textview;
private Button button1;
private Button button2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textview = (TextView) findViewById(R.id.tv);
button1 = (Button) findViewById(R.id.bt1);
button2 = (Button) findViewById(R.id.bt2);
button1.setOnClickListener(this);
button2.setOnClickListener(this);
}
public Handler handler = new Handler(){
public void handleMessage(Message msg){
switch(msg.what){
case SHOW_RESPONSE:
String response = (String) msg.obj;
try {
JSONObject jsobject1 = new JSONObject(response);
String data = jsobject1.getString("data");
JSONObject jsobject2 = new JSONObject(data);
String region = jsobject2.getString("region");
String isp = jsobject2.getString("isp");
textview.setText("归属地:"+region+" 运营商:"+isp);
} catch (JSONException e) {
e.printStackTrace();
}
}
}
};
public void sendget(){
new Thread(new Runnable() {
@Override
public void run() {
final String url = "http://ip.taobao.com/service/getIpInfo.php?ip=220.181.57.217";
HttpClient getClient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(url);
HttpResponse response;
try {
response = getClient.execute(httpGet);
if(response.getStatusLine().getStatusCode() ==200){
HttpEntity entity = response.getEntity();
String content = EntityUtils.toString(entity);
Message message = new Message();
message.what = SHOW_RESPONSE;
message.obj = content;
handler.sendMessage(message);
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
@Override
public void onClick(View v) {
switch(v.getId()){
case R.id.bt1:
sendget();
break;
case R.id.bt2:
break;
default:
break;
}
}
}
运行后点击httpGet按钮截图如下:
接下来看下发送POST请求:
1.声明一下网络权限,修改AndroidManifest.xml中的代码:
<uses-permission android:name="android.permission.INTERNET" />
2.HttpClient 是一个接口,因此无法创建它的实例, 通常情况下都会创建一个 DefaultHttpClient 的实例
HttpClient httpClient = new DefaultHttpClient();
3.创建一个HttpPost 对象, 并传入目标的网络地址(比如Servlet用于接收POST请求的地址)
final String url = "xxx";
HttpPost httpPost = new HttpPost(url);
4.通过一个NameValuePair集合来存放待提交的参数, 并将这个参数集合传入到一个UrlEncodedFormEntity中, 然后调用 HttpPost的setEntity()方法将构建好的 UrlEncodedFormEntity传入:
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("username", "admin"));
params.add(new BasicNameValuePair("password", "123456"));
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(params, "utf-8");
httpPost.setEntity(entity);
5.调用 HttpClient 的 execute()方法,并将 HttpPost 对 象传入:
httpClient.execute(httpPost);
6.执行execute()方法之后会返回一个HttpResponse对象, 服务器所返回的所有信息就会包含在这里面, 因此我们可以实例化一个HttpResponse对象来接收execute()方法返回的结果:
HttpResponse response = httpClient.execute(httpGet);
7.判断服务器返回的状态码,如果等于200就说明请求和响应都成功了:
if(httpResponse.getStatusLine().getStatusCode() == 200) {
// 请求和响应都成功了
}
8.在上面的if判断里面调用getEntity()方法获取到一个HttpEntity实例,然后再用EntityUtils.toString()这个静态方法将 HttpEntity 转换成字符串即可获取:
if(httpResponse.getStatusLine().getStatusCode() == 200) {
HttpEntity entity = response.getEntity();
String content = EntityUtils.toString(entity);
}
以下给出提供HttpClient发送POST数据到服务器MainActivity代码:
package com.example.androidstudyhttpclient;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.HttpEntity;
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;
import org.json.JSONException;
import org.json.JSONObject;
import com.example.androidstudypostget.R;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends Activity implements OnClickListener{
protected static final int SHOW_RESPONSE = 0;
protected static final int SHOW_RESPONSE2 = 1;
private TextView textview;
private Button button1;
private Button button2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textview = (TextView) findViewById(R.id.tv);
button1 = (Button) findViewById(R.id.bt1);
button2 = (Button) findViewById(R.id.bt2);
button1.setOnClickListener(this);
button2.setOnClickListener(this);
}
public Handler handler = new Handler(){
public void handleMessage(Message msg){
switch(msg.what){
case SHOW_RESPONSE2:
String response2 = (String) msg.obj;
textview.setText(response2);
}
}
};
public void sendpost(){
new Thread(new Runnable() {
public void run() {
final String url = "http://192.168.51.103:8080/ServletDemo/servlet/HttpClientPostDemo";
HttpClient postClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("name", "geek"));
params.add(new BasicNameValuePair("city", "shanghai"));
UrlEncodedFormEntity entity;
HttpResponse response;
try {
entity = new UrlEncodedFormEntity(params, "utf-8");
httpPost.setEntity(entity);
response = postClient.execute(httpPost);
if(response.getStatusLine().getStatusCode()==200){
HttpEntity entity2 = response.getEntity();
String content = EntityUtils.toString(entity2);
Message message = new Message();
message.what = SHOW_RESPONSE2;
message.obj = content;
handler.sendMessage(message);
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
@Override
public void onClick(View v) {
switch(v.getId()){
case R.id.bt1:
sendget();
break;
case R.id.bt2:
sendpost();
break;
default:
break;
}
}
}
Servlet代码如下:
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class HttpClientPostDemo extends HttpServlet {
public HttpClientPostDemo() {
super();
}
public void destroy() {
super.destroy();
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request,response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
String name = request.getParameter("name");
String city = request.getParameter("city");
PrintWriter out = response.getWriter();
out.write("Name is:"+name+" City is"+city);
out.flush();
out.close();
}
public void init() throws ServletException {
}
}