在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 {    }}

运行后点击httpPost按钮截图如下:

更多相关文章

  1. android常用的方法
  2. Android(安卓)Map 申请Debug Key的方法
  3. android TabHost(选项卡)的使用方法发布
  4. Android(安卓)四大核心组件
  5. Android资源管理中的Runtime Resources Overlay-------之overlay
  6. android UiAutomator自定义快速调试类
  7. 糊里糊涂学Android(1)——Activity之间的数据传递
  8. android开发AIDL实例
  9. 一个Activity的显示过程总结(一)

随机推荐

  1. Memory & Threading. (Android(安卓)Perf
  2. 在Android中集成FFmpeg
  3. Android中OkHttp的使用(详解)
  4. 开源项目之Android(安卓)Secrets(密码箱)
  5. Android、H5 单独调起拍照与摄像
  6. android studio中导入第三方库
  7. OkHttp学习系列二:谈谈Android中使用的坑
  8. 手把手教你在Windows下搭建React Native
  9. Matrix源码分析之第一篇
  10. NDK构建osgEarth到Android上——成功案例