【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

时间: 2024-12-01 00:59:31

【Android开发】网络编程及Internet应用-使用HttpClient访问网络的相关文章

【Android开发】网络编程及Internet应用-通过HTTP访问网络

通有线互联网一样,移动互联网也可以使用HTTP访问网络.在Android中,针对HTTP进行网络通信的方法主要有两种,一种是使用HttpURLConnection实现:另一种是使用HttpClient实现.下面分别进行介绍 1.使用HttpURLConnection访问网络 HttpURLConnection位于java.net包中,用于发送HTTP请求和获取HTTP响应.由于该类是抽象类,不能直接实例化对象,则需要使用URL的openConnection()方法来获得.例如,要创建一个http

c#-C#网络编程使用SharpPcap.dll来抓取网络上的TCP数据包,怎么才能完整的还原抓取的数据?

问题描述 C#网络编程使用SharpPcap.dll来抓取网络上的TCP数据包,怎么才能完整的还原抓取的数据? 5C 如题,C#网络编sd程使用SharpPcap.dll来抓取网络上的TCP数据包,怎么才能完整的还原抓取的数据?我是要抓取特定的两台机器之间的数据传递,已知传递的数据包的组成规则,有这么几个问题:1.怎么才能完整的获取所有的数据包?2.获取的数据包需不需要考虑TCP数据包的重传或者错误传递的数据包? 谢谢. 解决方案 c# 使用sharppcap实现 网络抓包 使用SharpPCa

清单文件-使用HttpClient访问网络

问题描述 使用HttpClient访问网络 使用HttpClient访问网络 清单文件 android:minSdkVersion="14" android:targetSdkVersion="19" /> 出错 用 android:minSdkVersion="9" /> 就没错.请问是什么问题 解决方案 从11开始,就不允许和在主线程中请求了 解决方案二: 关于这个异常可以定义一个线程,把http请求的部分放在线程里去做. 解决方

【Android开发】网络编程及Internet应用-获取天气预报

在Eclipse中创建Android项目,利用之前学过的WebView控件和中国天气网提供的天气数据接口,实现获取指定城市的天气预报. 布局文件: res/layout/main.xml: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:too

python网络编程学习笔记(二):socket建立网络客户端_python

1.建立socket 建立socket对象需要搞清通信类型和协议家族.通信类型指明了用什么协议来传输数据.协议的例子包括IPv4.IPv6.IPX\SPX.AFP.对于internet通信,通信类型基本上都是AF_INET(和IPv4对应).协议家族一般表示TCP通信的SOCK_STREAM或者表示UDP通信的SOCK_DGRAM.因此对于TCP通信,建立一个socket连接的语句为:s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)对于UDP通

java网络编程-Java写了个简单的网络编程程序,运行没有结果,求解谢谢!

问题描述 Java写了个简单的网络编程程序,运行没有结果,求解谢谢! import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintStream; import java.io.PrintWriter; import ja

Linux网络编程使用多进程实现服务器并发访问

  采用多进程的方式实现服务器的并发访问的经典范例. 程序实现功能: 1.客户端从标准输入读入一行文字,发送到服务器. 2.服务器接收到客户端发来的文字后,原样返回给客户端. 3.客户端接收到服务器的发来的文字后,输出到标准输出,然后继续以上步骤. 服务器端过程:建立好监听套接字后,等待客户端的连接,接收到一个连接后,创建一个子进程来与客户端进行通信,主进程则继续等待其他客户端的连接.代码如下: #include #include #include #include #include #incl

java网络编程-java中HttpGet和HttpClient和HttpResponse之间的联系是如何的

问题描述 java中HttpGet和HttpClient和HttpResponse之间的联系是如何的 java中HttpGet和HttpClient和HttpResponse之间的联系是如何的 每一个对象分别承载着什么信息 解决方案 public class HTTPGetSample { public static void main(String[] args) throws ClientProtocolException, IOException { String url = "http:

iOS开发网络篇—网络编程基础(一)

一.为什么要学习网络编程 1.简单说明 在移动互联网时代,移动应用的特征有: (1)几乎所有应用都需要用到网络,比如QQ.微博.网易新闻.优酷.百度地图 (2)只有通过网络跟外界进行数据交互.数据更新,应用才能保持新鲜.活力 (3)如果没有了网络,也就缺少了数据变化,无论外观多么华丽,终将变成一潭死水 移动网络应用 = 良好的UI + 良好的用户体验 + 实时更新的数据 新闻:网易新闻.新浪新闻.搜狐新闻.腾讯新闻 视频:优酷.百度视频.搜狐视频.爱奇艺视频 音乐:QQ音乐.百度音乐.酷狗音乐.