【Android开发】网络编程及Internet应用-使用HttpClient访问网络

简介:
    前面介绍了使用java.net包中的HttpURLConnection类来访问网络,在一般情况下,如果只需要到某个简单页面提交请求并获取服务器的响应,完全可以使用该技术来实现。不过,对于比较复杂的联网操作,使用HttpURLConnection类就不一定能满足要求,这时,可以使用Apache组织提供的HttpClient项目来实现。在Android中,已经成功的集成了HttpClient,所以可以直接在Android中使用HttpClient来访问网络。

    HttpClient实际上是对Java提供的访问网络的方法进行了封装。HttpURLConnection类中的输入\输出流操作,在HttpClient中被统一封装成了HttpGet、HttpPost和HttpResponse类,这样就简化了操作。其中,HttpGet类代表发送GET请求;HttpPost类代表发送POST请求;HttpResponse类代表处理响应的对象。


    同使用HttpURLConnection类一样,使用HttpClient发送HTTP请求也可以分为发送GET请求和POST请求两种,下面分别进行介绍。

1.发送GET请求

需要以下几个步骤
(1)创建HttpClient对象
(2)创建HttpGet对象
(3)如果需要发送请求参数,可以直接将要发送的参数连接到URL地址中,也可以调用HttpGet的setParams()方法来添加请求参数
(4)调用HttpClient对象的execute()方法发送请求。执行该方法将返回一个HttpResponse对象。
(5)调用HttpResponse的getEntity()方法,可获得包含服务器相应内容的HttpEntity对象,通过该对象可以获得服务器的相应内容。

下面通过一个实例来说明如何使用HttpClient来发送GET请求

界面:有一个"发送Get请求"的按钮和一个文本区域,点击按钮可以在文本区查看服务器端返回的数据
res/layout/main.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/ll1"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
    
	<Button android:id="@+id/button"
	    android:layout_width="wrap_content"
	    android:layout_height="wrap_content"
	    android:text="发送GET请求"/>
	
	<TextView android:id="@+id/textView1"
	    android:layout_width="wrap_content"
	    android:layout_height="wrap_content"/>
	
</LinearLayout>

界面图略

主界面
MainActivity:
package com.example.test;  
  
import java.io.IOException;


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 android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;
import android.widget.TextView;
  
public class MainActivity extends Activity{  
	 private Button button;//声明一个"发送GET请求"按钮对象
	 private Handler handler;//声明一个Handler对象
	 private String result="";//声明一个代表显示结果的字符串
	 private TextView resultTV;//声明一个显示结果的文本框对象
    @Override  
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.main);
         
        resultTV=(TextView)findViewById(R.id.textView1);
        button=(Button)findViewById(R.id.button);
        //为按钮添加单击事件监听
        button.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View arg0) {
			    //创建一个新线程,用于发送并获取GET请求
				new Thread(new Runnable() {
					
					@Override
					public void run() {
						send();
						Message m=handler.obtainMessage();
						handler.sendMessage(m);
					}
				}).start();
				
			}
		});
        
        handler=new Handler(){


			@Override
			public void handleMessage(Message msg) {
				if(result!=null){
					resultTV.setText(result);
				}
				super.handleMessage(msg);
			}
        	
        };
	}
    
    public void send() {
		String target="http://192.168.1.113:8080/WeiXinTest/index.jsp?param=get";//要提交的目标地址
		HttpClient httpclient=new DefaultHttpClient();
		HttpGet httpRequest=new HttpGet(target);
		HttpResponse httpResponse;
		try {
			httpResponse=httpclient.execute(httpRequest);
			if(httpResponse.getStatusLine().getStatusCode()==HttpStatus.SC_OK){
				result=EntityUtils.toString(httpResponse.getEntity());
			}else{
				result="请求失败";
			}
		} catch (ClientProtocolException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}


	}
}  

在安卓的配置文件AndroidManifest.xml中别忘记加入访问网络的权限:
<!-- 添加链接网络的权限 -->
<uses-permission android:name="android.permission.INTERNET"/>

在JAVAEE工作台(或MyEclipse)中创建一个名为"WenXinTest"的Web应用,在index.jsp中写下如下关键代码:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" contentType="text/html"%>


<%
	String param=request.getParameter("param");//获取参数值
	if(!"".equals(param)||param!=null){
		if("get".equals(param)){
			out.print("发送GET请求成功!(*^__^*) ");
		}
	}
%>

接着将应用部署至tomcat,启动tomcat进行测试。

客户端测试结果如图


证明数据已经由客户端发至Web应用,然后经由服务端处理后发回客户端

2.发送POST请求
同使用HttpURLConnection类发送请求一样,对于复杂的请求数据,也需要使用POST方式发送,使用HttpClient发送POST请求大致可以分为以下几个步骤:
(1)创建HttpClient对象
(2)创建HttpPost对象
(3)如果需要发送请求参数,可以调用HttpPost的setParam()方法来添加请求参数,也可以调用setEntity()方法来设置请求参数。
(4)调用HttpClient对象的execute()方法发送请求,该方法将返回一个HttpResponse对象
(5)调用HttpResponse的getEntity()方法,可以获得包含服务器相应内容的HttpEntity对象,通过该对象可以获取服务器的响应内容。

下面通过一个实例来说明如何使用HttpClient来发送POST请求

界面:一个编辑框用来填写昵称和微博信息,一个按钮用来实现发布,下面的文本框显示服务器返回的信息。
res/layout/main.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/ll1"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
    
    <EditText android:id="@+id/editView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
    
	<Button android:id="@+id/button"
	    android:layout_width="wrap_content"
	    android:layout_height="wrap_content"
	    android:text="发送POST请求"/>
	
	<TextView android:id="@+id/textView1"
	    android:layout_width="wrap_content"
	    android:layout_height="wrap_content"/>
	
</LinearLayout>

界面图略

主界面
MainActivity:
package com.example.test;  
  
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;


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.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;


import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
  
public class MainActivity extends Activity{  
	 private EditText nickname;//获取一个输入昵称的编辑框对象 
	 private EditText content; //获取一个输入文本内容的编辑框对象
	 private Button button;//声明一个"发送POST请求"按钮对象
	 private Handler handler;//声明一个Handler对象
	 private String result="";//声明一个代表显示结果的字符串
	 private TextView resultTV;//声明一个显示结果的文本框对象
    @Override  
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.main);
         
        nickname=(EditText)findViewById(R.id.nickname);
        content=(EditText)findViewById(R.id.content);
        resultTV=(TextView)findViewById(R.id.textView1);
        button=(Button)findViewById(R.id.button);
        //为按钮添加单击事件监听
        button.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View arg0) {
				if("".equals(content.getText().toString())){
					Toast.makeText(MainActivity.this,"请输入要发表的内容", Toast.LENGTH_SHORT).show();
					return;
				}
			    //创建一个新线程,用于发送并获取GET请求
				new Thread(new Runnable() {
					
					@Override
					public void run() {
						send();
						Message m=handler.obtainMessage();//获取一个Message
						handler.sendMessage(m);//发送消息
					}
				}).start();//开启线程
				
			}
		});
        
        handler=new Handler(){


			@Override
			public void handleMessage(Message msg) {
				if(result!=null){
					resultTV.setText(result);
					content.setText("");//清空内容编辑框
					nickname.setText("");//清空昵称编辑框
				}
				super.handleMessage(msg);
			}
        	
        };
	}
    
    public void send() {
		String target="http://192.168.1.113:8080/WeiXinTest/index.jsp";//要提交的目标地址
		HttpClient httpclient=new DefaultHttpClient();
		HttpPost httpRequest=new HttpPost(target);
		//将要传递的参数保存到List集合中
		List<NameValuePair> params=new ArrayList<NameValuePair>();
		//NameValuePair类似于Java.util.HashMap,有一个键值对
		params.add(new BasicNameValuePair("param","post"));//标记参数
		params.add(new BasicNameValuePair("nickname",nickname.getText().toString()));//昵称
		params.add(new BasicNameValuePair("content",content.getText().toString()));//内容
		
		try {
			httpRequest.setEntity(new UrlEncodedFormEntity(params,"utf-8"));//设置编码方式
			HttpResponse httpResponse=httpclient.execute(httpRequest);//执行HttpClient请求
			if(httpResponse.getStatusLine().getStatusCode()==HttpStatus.SC_OK){//如果请求成功
				result+=EntityUtils.toString(httpResponse.getEntity());//获取返回的字符串
			}else{
				result="请求失败";
			}
		} catch (UnsupportedEncodingException e1) {
			e1.printStackTrace();
		} catch (ClientProtocolException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}


	}
}  

在安卓的配置文件AndroidManifest.xml中别忘记加入访问网络的权限:
<!-- 添加链接网络的权限 -->
<uses-permission android:name="android.permission.INTERNET"/>



在JAVAEE工作台(或MyEclipse)中创建一个名为"WenXinTest"的Web应用,在index.jsp中写下如下关键代码:
<pre name="code" class="html"><%@ page language="java" import="java.util.*" pageEncoding="UTF-8" contentType="text/html"%>


<%
	String param=request.getParameter("param");//获取参数值
	if(!"".equals(param)||param!=null){
		if("get".equals(param)){
			out.print("发送GET请求成功!(*^__^*) ");
		}else if("post".equals(param)){
			String content=request.getParameter("content");
			String nickname=request.getParameter("nickname");
			if(content!=null&&nickname!=null){
				nickname=new String(nickname.getBytes("iso-8859-1"),"utf-8"); 
				content=new String(content.getBytes("iso-8859-1"),"utf-8"); 
				String date=new java.util.Date().toLocaleString();
				out.println("["+nickname+"]于"+date+"发表一条微博,内容如下:");
				out.println(content);
			}
		}
	}
%>
 接着将应用部署至tomcat,启动tomcat进行测试。


客户端测试结果如图


证明数据已经由客户端发至Web应用,然后经由服务端处理后发回客户端


转载请注明出处:http://blog.csdn.net/acmman/article/details/46414549

相关文章
|
2天前
|
编解码 Java Android开发
通义灵码:在安卓开发中提升工作效率的真实应用案例
本文介绍了通义灵码在安卓开发中的应用。作为一名97年的聋人开发者,我在2024年Google Gemma竞赛中获得了冠军,拿下了很多项目竞赛奖励,通义灵码成为我的得力助手。文章详细展示了如何安装通义灵码插件,并通过多个实例说明其在适配国际语言、多种分辨率、业务逻辑开发和编程语言转换等方面的应用,显著提高了开发效率和准确性。
|
1天前
|
Android开发 开发者 UED
安卓开发中自定义View的实现与性能优化
【10月更文挑战第28天】在安卓开发领域,自定义View是提升应用界面独特性和用户体验的重要手段。本文将深入探讨如何高效地创建和管理自定义View,以及如何通过代码和性能调优来确保流畅的交互体验。我们将一起学习自定义View的生命周期、绘图基础和事件处理,进而探索内存和布局优化技巧,最终实现既美观又高效的安卓界面。
11 5
|
3天前
|
存储 IDE 开发工具
探索Android开发之旅:从新手到专家
【10月更文挑战第26天】在这篇文章中,我们将一起踏上一段激动人心的旅程,探索如何在Android平台上从零开始,最终成为一名熟练的开发者。通过简单易懂的语言和实际代码示例,本文将引导你了解Android开发的基础知识、关键概念以及如何实现一个基本的应用程序。无论你是编程新手还是希望扩展你的技术栈,这篇文章都将为你提供价值和启发。让我们开始吧!
|
3天前
|
搜索推荐 开发工具 Android开发
打造个性化Android应用:从设计到实现的旅程
【10月更文挑战第26天】在这个数字时代,拥有一个能够脱颖而出的移动应用是成功的关键。本文将引导您了解如何从概念化阶段出发,通过设计、开发直至发布,一步步构建一个既美观又实用的Android应用。我们将探讨用户体验(UX)设计的重要性,介绍Android开发的核心组件,并通过实际案例展示如何克服开发中的挑战。无论您是初学者还是有经验的开发者,这篇文章都将为您提供宝贵的见解和实用的技巧,帮助您在竞争激烈的应用市场中脱颖而出。
|
5天前
|
算法 Java 数据库
Android 应用的主线程在什么情况下会被阻塞?
【10月更文挑战第20天】为了避免主线程阻塞,我们需要合理地设计和优化应用的代码。将耗时操作移到后台线程执行,使用异步任务、线程池等技术来提高应用的并发处理能力。同时,要注意避免出现死循环、不合理的锁使用等问题。通过这些措施,可以确保主线程能够高效地运行,提供流畅的用户体验。
16 2
|
9天前
|
Java API Android开发
安卓应用程序开发的新手指南:从零开始构建你的第一个应用
【10月更文挑战第20天】在这个数字技术不断进步的时代,掌握移动应用开发技能无疑打开了一扇通往创新世界的大门。对于初学者来说,了解并学习如何从无到有构建一个安卓应用是至关重要的第一步。本文将为你提供一份详尽的入门指南,帮助你理解安卓开发的基础知识,并通过实际示例引导你完成第一个简单的应用项目。无论你是编程新手还是希望扩展你的技能集,这份指南都将是你宝贵的资源。
34 5
|
7天前
|
设计模式 IDE Java
探索安卓开发:从新手到专家的旅程
【10月更文挑战第22天】 在数字时代的浪潮中,移动应用开发如同一座金矿,吸引着无数探险者。本文将作为你的指南针,指引你进入安卓开发的广阔天地。我们将一起揭开安卓平台的神秘面纱,从搭建开发环境到掌握核心概念,再到深入理解安卓架构。无论你是初涉编程的新手,还是渴望进阶的开发者,这段旅程都将为你带来宝贵的知识和经验的财富。让我们开始吧!
|
7天前
|
搜索推荐 Android开发 UED
安卓开发中的自定义视图:打造个性化用户界面
【10月更文挑战第22天】在安卓应用的海洋中,如何让你的应用脱颖而出?一个独特且直观的用户界面(UI)至关重要。本文将引导你通过自定义视图来打造个性化的用户体验,从基础的视图绘制到触摸事件的处理,我们将一步步深入探讨。准备好了吗?让我们开始吧!
|
8天前
|
Android开发
我是一位Android工程师,用通义灵码的AS插件做开发工作助手,对比之前没有灵码,现在提效了60%
我是一位Android工程师,用通义灵码的AS插件做开发工作助手,对比之前没有灵码,现在提效了60%
20 0
|
1天前
|
SQL 安全 算法
网络安全与信息安全:漏洞、加密技术与安全意识的交织
【10月更文挑战第28天】在数字时代的浪潮中,网络安全与信息安全成为保护个人隐私和企业资产的重要盾牌。本文将深入探讨网络安全中的常见漏洞,介绍加密技术的基本概念及其在保护数据中的应用,并强调提高安全意识的重要性。通过分析具体案例和提供实用的防护措施,旨在为读者提供一个全面的网络安全知识框架,以应对日益复杂的网络威胁。
11 4