Android 网络应用--Apache HttpClient的使用

使用HttpClient发送请求,接收响应很简单,只要5步:

  1. 创建HttpClient 对象
  2. 创建HttpGet对象;或者是HttpPost 对象
  3. 如果需要发送请求参数,可以调用HttpGet HttpPost共同的setParams(HttpParams params) 方法来添加请求参数;对于HttpPost对象,也可以调用setEntity(HttpEntity entity)方法来设置请求参数
客户端条件参数:
List<NameValuePair> params = new
                                                    ArrayList<NameValuePair>();
                                            params.add(new BasicNameValuePair
                                                    ("LoginName", name));
                                            params.add(new BasicNameValuePair
                                                    ("LoginPassword", pass));
                                            // 设置编码
                                            post.setEntity(new UrlEncodedFormEntity(
                                                    params, HTTP.UTF_8));
服务器端接收:
String loginName = request.getParameter("LoginName");
String loginPassword = request.getParameter("LoginPassword");

4.调用HttpClient对象的excute()发送请求,返回一个HttpResponse 对象。

5.调用HttpResponse的getAllHeaders(),getHeaders()等方法可以获取服务器的响应头;调用HttpResponse的getEntity()可以获取HttpEntity对象,该对象包转了服务器的响应内容。

登录的实例:核心代码

服务器端用的servlet搭建

package LoginServlet;

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 AndroidLoginServler extends HttpServlet {

	private static final long serialVersionUID = 1L;

	public AndroidLoginServler() {
		super();
	}

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		this.doPost(request, response);
		System.out.println("doGet");

	}

	// Url 地址
	// http://localhost:8080/Android_Client/servlet/AndroidLoginServler?LoginName=yu&LoginPassword=123
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		System.out.println("doPost");
		request.setCharacterEncoding("UTF-8");
		String loginName = request.getParameter("LoginName");
		String loginPassword = request.getParameter("LoginPassword");
		System.out.println(loginName);
		System.out.println(loginPassword);
		// 统一字符 避免乱码
		response.setCharacterEncoding("UTF-8");
		response.setContentType("text/html;charset=UTF-8");
		PrintWriter out = null;
		try {
			/*
			 * 登录业务判断
			 */
			out=response.getWriter();

			if (loginName.equals("yu") && loginPassword.equals("123")) {
				// 登陆成功
				out.print("success");
			} else {
				// 登陆失败
				out.print("failed");
			}
		} finally {
			if (out != null)
				out.close();
		}
	}

}

客户端

package com.example.xiaocool.httpclienttest;

import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
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.protocol.HTTP;
import org.apache.http.util.EntityUtils;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

public class MainActivity extends ActionBarActivity {

    TextView response;
    HttpClient httpClient;
    Handler handler = new Handler() {
        public void handleMessage(Message msg) {
            if (msg.what == 0x123) {

                response.append(msg.obj.toString() + "\n");
            }
        }
    };

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        // 创建DefaultHttpClient对象
        httpClient = new DefaultHttpClient();
        response = (TextView) findViewById(R.id.response);
    }

    public void accessSecret(View v) {
        response.setText("");
        new Thread() {
            @Override
            public void run() {
                // 创建HttpGet对象
                HttpGet get = new HttpGet(
                        "http://112.237.241.204:8080/Android_Client/servlet/AndroidLoginServler?LoginName=yu&LoginPassword=123");
                try {
                    // 发送get
                    HttpResponse httpResponse = httpClient.execute(get);
                    HttpEntity entity = httpResponse.getEntity();
                    if (entity != null) {

                        BufferedReader br = new BufferedReader(
                                new InputStreamReader(entity.getContent()));
                        String line = null;

                        while ((line = br.readLine()) != null) {
                            Message msg = new Message();
                            msg.what = 0x123;
                            msg.obj = line;
                            handler.sendMessage(msg);
                        }
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }.start();
    }

    public void showLogin(View v) {
        //加载登陆界面
        final View loginDialog = getLayoutInflater().inflate(
                R.layout.login, null);
        //使用对话框供用户登陆系统
       new AlertDialog.Builder(MainActivity.this)
                .setTitle("登录系统")
                .setView(loginDialog)
                .setPositiveButton("登陆",
                        new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog,
                                                int which) {
                                final String name = ((EditText) loginDialog
                                        .findViewById(R.id.name)).getText()
                                        .toString();
                                final String pass = ((EditText) loginDialog
                                        .findViewById(R.id.pass)).getText()
                                        .toString();
                                /*final String uri="http://112.237.241.204:8080/Android_Client/servlet/AndroidLoginServler?LoginName=" +
                                        name+"&LoginPassword="+pass;*/
                                final String uri="http://112.237.241.204:8080/Android_Client/servlet/AndroidLoginServler";
                                new Thread() {
                                    @Override
                                    public void run() {
                                        try {
                                            HttpPost post = new HttpPost(uri);
                                            /**
                                             *
                                             定义了一个list,该list的数据类型是NameValuePair(简单名称值对节点类型,
                                             这个代码多处用于Java像url发送Post请求。在发送post请求时用该list来存放参数
                                             */
                                            List<NameValuePair> params = new
                                                    ArrayList<NameValuePair>();
                                            params.add(new BasicNameValuePair
                                                    ("LoginName", name));
                                            params.add(new BasicNameValuePair
                                                    ("LoginPassword", pass));
                                            // 设置编码
                                            post.setEntity(new UrlEncodedFormEntity(
                                                    params, HTTP.UTF_8));

                                            HttpResponse response = httpClient
                                                    .execute(post);
                                            // 如果服务器成功返回响应
                                            if (response.getStatusLine()
                                                    .getStatusCode() == 200) {
                                                String msg = EntityUtils
                                                        .toString(response.getEntity());
                                                Looper.prepare();
                                                //显示从服务器返回的信息
                                                Toast.makeText(MainActivity.this,
                                                        msg, Toast.LENGTH_SHORT).show();
                                                Looper.loop();
                                            }
                                        } catch (Exception e) {
                                            e.printStackTrace();
                                        }
                                    }
                                }.start();
                            }
                        }).setNegativeButton("取消", null).show();
    }
}

时间: 2024-08-07 14:48:46

Android 网络应用--Apache HttpClient的使用的相关文章

android使用apache httpclient发送post请求

package com.liuc; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.apache.ht

Android用Apache HttpClient 实现POST和Get请求

快速记忆(POST) 1.       要想连接网络,肯定需要一个客户端对象,所以首先创建一个客户端对象HttpClient 2.       拥有客户端对象之后肯定需要对互联网进行访问,首先要对互联网进行请求,所以要创建一个请求对象HttpUriRequest,因为是Post请求,所以使用HttpPost 3.       我们知道请求对象包含请求行(方法.路径.协议),消息头,请求实体三部分.通过new HttpPost(uri)可以设置请求行的路径,现在需要设置请求实体中的请求参数. 我们

Android 6.0 使用 Apache HttpClient

Android 6.0版本已经已经基本将Apahce Http Client 移除出SDK. 那么问题来了,如果我在以前的项目中使用了Apache HttpClient相关类,怎么办呢? 请看官网给出的答案 Apache HTTP Client Removal Android 6.0 release removes support for the Apache HTTP client. If your app is using this client and targets Android 2.

android网络应用开发完全解析

??Android网络应用开发,主要有两种方式,一种是socket(是对tcp/udp协议的封装),另外一种就是使用Http协议,Android中主要提供了两种方式,HttpURLConnection和Apache HttpClient.下面对Android网络应用开发进行具体的阐述. 一.基于socket的网络通信 1.基于udp的socket编程步骤 定义码头 即:定义一个DatagramSocket对象ds 定义可以用来接收或者发送数据的集装箱 即:定义DatagramPacket对象dp

Apache HttpClient : Http Cookies

前言 HttpClient已经被集成到Android的SDK里,但在JDK里面仍然需要HttpURLConnectionn发起HTTP请求.HttpClient可以看做是一个加强版的HttpURLConnection,但它的侧重点是如何发送请求.接受相应和管理Http连接. 在介绍Http Cookies之前,笔者给出一个应用场景:你需要一个根据地理信息(城市名或者经纬度)获取天气的应用.可选的API很多,不幸的是,网上提到的Google天气API已经停止服务了(不是被墙):雅虎是英文的,且需要

Android网络(3):HttpClient作客户端,Tomcat Servlet作服务器的交互示例

前面相继介绍了Android网络编程里的Socket传输图片.HttpURLConnection,今天看HttpClient. 第一部分:JavaEE版的Eclipse配置Tomcat [备注:开发后台服务器用Eclipse的JavaEE版最好的,但单就Tomcat来说(不写jsp之类的),本文下面的服务器方面操作在普通版的Eclipse也是可以的.我这里为了和ADT-bundle分开,特意重新安个JavaEE版的Eclipse.] 1.下载Eclipse的Tomcat插件:http://www

一起学android之Apache接口(17)

Apache HttpClient是一个开源项目,为客户端的HTTP编程提供高效.最新.功能丰富的工具包支持. 在Apache HttpClient库中,我们常用的对网络连接有用的包主要有以下几类: -org.apache.http.HttpResponse -org.apache.http.client.HttpClient -org.apache.http.client.methods.HttpGet -org.apache.http.impl.client.DefaulfHttpClien

Android网络(4):HttpClient必经之路----使用线程安全的单例模式HttpClient,及HttpClient和Application的融合

上文简单介绍了HttpClient和Tomcat服务器的交互,主角是HttpClient,然后它跟服务器交互有两种方式即get和post.所以这个HttpClient就类似于电脑上用的浏览器.当我打开多个网页的时候,并不需要开一个网页就开一个浏览器,而是一个浏览器上面开了好几个网页.对应于HttpClient,即无需连接一次就new一个HttpClient.一般,我们希望一个应用里就一个HttpClient就ok了,就像我们的手机或PC,没人会呼呼的装好几个浏览器.本文即解决此问题,代码可以直接

Android网络应用——疯狂android讲义笔记

基于TCP协议的网络通信 TCP协议基础 使用ServerSocket创建TCP服务器端 使用Socket进行通信 加入多线程 使用URL访问网络资源 使用URL读取网络资源 使用URLConnection提交请求 使用HTTP访问网络 HttpURLConnection类 使用Apache HttpClient类 使用webview视图显示网页 使用webvie浏览网页 用webview加载html代码 使用webview中的javaScript调用android方法 使用web servic