zoukankan      html  css  js  c++  java
  • Android笔记---使用HttpClient发送POST和GET请求

    在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对象, server所返回的全部信息就会包括在这里面, 因此我们能够实例化一个HttpResponse对象来接收execute()方法返回的结果:

    HttpResponse response = httpClient.execute(httpGet);

    5.推断server返回的状态码,假设等于 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对象, server所返回的全部信息就会包括在这里面, 因此我们能够实例化一个HttpResponse对象来接收execute()方法返回的结果:

    HttpResponse response = httpClient.execute(httpGet);

    7.推断server返回的状态码,假设等于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数据到serverMainActivity代码:

    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按钮截图例如以下:
    这里写图片描写叙述

  • 相关阅读:
    TCP Socket服务器编程[转文]
    http协议学习和总结系列[转 ]
    linux C函数大全
    HTTP 协议详解
    Pthread 多线程总结
    linux 中解析命令行参数 (getopt_long用法)
    微软企业库4.1学习笔记(十八)缓存模块6 缓存的设计目的
    微软企业库4.1学习笔记(十七)缓存模块5 缓存的典型用法
    进程和线程的区别
    C#二叉树遍历算法实现浅析
  • 原文地址:https://www.cnblogs.com/yxysuanfa/p/7248442.html
Copyright © 2011-2022 走看看