赵雅智_HttpClient的 get请求和post请求

DefaultHttpClient和它的兄弟AndroidHttpClient都是HttpClient具体的实现类,它们都拥有众多的API,而且实现比较稳定,bug数量也很少。

但同时也由于HttpClient的API数量过多,使得我们很难在不破坏兼容性的情况下对它进行升级和扩展,所以目前Android团队在提升和优化HttpClient方面的工作态度并不积极。

在Android开发中,Android SDK附带了Apache的HttpClient,它是一个完善的客户端。它提供了对HTTP协议的全面支持,可以使用HttpClient的对象来执行HTTP GET和HTTP POST调用。

HTTP工作原理:

1.客户端(一般是指浏览器,这里是指自己写的程序)与服务器建立连接

2.建立连接后,客户端向服务器发送请求

3.服务器接收到请求后,向客户端发送响应信息

4.客户端与服务器断开连接

HttpClient的一般使用步骤:

1.使用DefaultHttpClient类实例化HttpClient对象

2.创建HttpGet或HttpPost对象,将要请求的URL通过构造方法传入HttpGet或HttpPost对象。

3.调用execute方法发送HTTP GET或HTTP POST请求,并返回HttpResponse对象。

4.读response

5.通过HttpResponse接口的getEntity方法返回响应信息,并进行相应的处理。

6.释放连接。无法执行方法是否成功,都必须释放链接

最后记得要在AndroidManifest.xml文件添加网络权限

<uses-permission android:name="android.permission.INTERNET" />

案例

运行效果:

      

<!-- 添加网络访问权限 -->

<uses-permission android:name="android.permission.INTERNET"/>

布局文件 activity_login.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" >

    <TextView
        android:id="@+id/username"
        android:layout_width="wrap_content"
		android:layout_height="wrap_content"
		android:textSize="20sp"
		android:layout_alignBaseline="@+id/editusername"
		android:text="@string/username"/>

    <EditText
        android:id="@+id/editusername"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_toRightOf="@+id/username"
        android:hint="@string/edit_username"
        />

        <TextView
        android:id="@+id/password"
        android:layout_width="wrap_content"
		android:layout_height="wrap_content"
		android:textSize="20sp"
		android:layout_below="@+id/username"
		android:layout_alignBaseline="@+id/editpass"
		android:text="@string/password"/>

    <EditText
        android:id="@+id/editpass"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_toRightOf="@+id/password"
        android:layout_below="@+id/editusername"
        android:hint="@string/edit_password"
        />

    <Button
        android:id="@+id/btn_login"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="80dp"
        android:layout_below="@+id/password"
        android:layout_marginLeft="50dp"
        android:text="@string/btn_sure"
        android:onClick="login"
        />

    <CheckBox
        android:id="@+id/checkbox"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="50dp"
        android:layout_alignBaseline="@+id/btn_login"
        android:layout_below="@+id/editpass"
        android:layout_toRightOf="@+id/btn_login"
       	android:text="@string/checkbox"
       	/>

    <TextView
        android:id="@+id/tv_result"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:text="@string/tip_result"/>
</RelativeLayout> 

String.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string name="app_name">lesson03</string>
    <string name="hello_world">Hello world!</string>
    <string name="action_settings">Settings</string>

    <string name="username">用户名</string>
	<string name="password">密    码</string>
	<string name="edit_username">请输入用户名</string>
	<string name="edit_password">请输入密码</string>
 	<string name="btn_sure">确定</string>
    <string name="checkbox">是否记住密码</string>

    <string name="tip_result">服务器返回的数据</string>
</resources>

流转字符工具类 StreamTools.java

package com.example.util;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;

public class StreamTools {
/**
 * 把流轉換成字符串
 * @param is
 * @return
 */
	public static String streamToStr(InputStream is){

		try {
			// 字节的输出流
			ByteArrayOutputStream os = new ByteArrayOutputStream();
			// 定义读取长度
			int len = 0;
			// 定义缓冲区
			byte buffer[] = new byte[1024];
			// 从输入流中读取,并写入os对象中
			while ((len = is.read(buffer)) != -1) {
				os.write(buffer, 0, len);
			}
			// 关闭流
			is.close();
			os.close();
			// 写到字节流
			return new String(os.toByteArray());
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		}
	}
}

Activity类 LoginActivity.java

package com.example.android_httplogin;

import java.io.InputStream;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;

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 android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import com.example.util.StreamTools;

public class MainActivity extends Activity {

	private EditText et_name, et_pass;
	private final int CHANGETEXT = 1;// 声明消息标识符
	private TextView tv_result;
	// 处理者
	private Handler handler = new Handler() {
		// 处理消息的方法
		public void handleMessage(android.os.Message msg) {
			int what = msg.what;// 消息的标识
			switch (what) {
			case CHANGETEXT:
				String result = (String) msg.obj;// 得到消息内容
				tv_result.setText(result);// 重新设置文本内容
				break;

			default:
				break;
			}
		};
	};

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_login);
		et_name = (EditText) findViewById(R.id.editusername);
		et_pass = (EditText) findViewById(R.id.editpass);
		tv_result = (TextView) findViewById(R.id.tv_result);
	}

	public void login(View v) {
		int id = v.getId();
		switch (id) {
		case R.id.btn_login:
			// 获取控件的文本内容
			final String userName = et_name.getText().toString();
			final String userPass = et_pass.getText().toString();
			// 判断是否为空
			if (TextUtils.isEmpty(userName.trim())
					|| TextUtils.isEmpty(userPass.trim())) {
				Toast.makeText(getApplicationContext(), "用户名或者密码不能为空", 0)
						.show();
			} else {
				// 发送请求到服务器
				new Thread(new Runnable() {

					@Override
					public void run() {
						httpClintGet(userName, userPass);

					}
				}).start();
			}

			break;

		default:
			break;
		}
	}

	public void httpClintGet(String userName, String userPass) {
		// 1.创建httpClient的实例
		// httpClient 发请求GET方式处理
		HttpClient client = new DefaultHttpClient(); // DefaultHttpClient
														// extends
														// AbstractHttpClient
		try {
			// 2.创建某种连接方法的实例.
			String uri = "http://172.16.237.144:8080/Login/LoginServlet?username="
					+ URLEncoder.encode(userName, "UTF-8") + "&userpass="
					+ URLEncoder.encode(userPass, "UTF-8");
			// localhost客户端
			HttpGet httpGet = new HttpGet(uri);
			// 3.调用第一步创建好的实例的execute 方法来执行第二部中创建好的method实例
			HttpResponse response = client.execute(httpGet);// 相当于在浏览器敲回车
			// 4.读response
			if (response.getStatusLine().getStatusCode() == 200) {
				HttpEntity entity = response.getEntity();// 返回实体对象
				InputStream is = entity.getContent();// 读取实体中的内容
				String result = StreamTools.streamToStr(is);
				System.out.println("--------------" + result);

				Message msg = new Message();
				msg.what = CHANGETEXT;
				msg.obj = result;

				handler.sendMessage(msg);

			}

		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			// 5.释放连接。无法执行方法是否成功,都必须释放链接
			client.getConnectionManager().shutdown();
		}
	}

	/**
	 * httpClient中方式的处理
	 *
	 * @param userName
	 * @param userPass
	 */
	public void httpClientPost(String userName, String userPass) {
		// 1.创建httpClient的实例。
		HttpClient client = new DefaultHttpClient(); // DefaultHttpClient
														// extends
														// AbstractHttpClient
		// 2.创建某种连接方法的实例.在这里是HttpPost。在 HttpPost 的构造函数中传入待连接的地址
		String uri = "http://172.16.237.144:8080/Login/LoginServlet";
		// localhost客户端
		HttpPost httpPost = new HttpPost(uri);
		try {

			// 封装传递参数的集合
			List<NameValuePair> parameters = new ArrayList<NameValuePair>();
			// 往这个集合中添加你要传递的参数
			parameters.add(new BasicNameValuePair("username", userName));
			parameters.add(new BasicNameValuePair("userpass", userPass));
			// 创建传递参数封装 实体对象
			UrlEncodedFormEntity entity = new UrlEncodedFormEntity(parameters,
					"UTF-8");
			// StringEntity
			// AbstractHttpClient //HttpEntity
			// 把实体对象存入httpPost对象中
			httpPost.setEntity(entity);
			// 3.调用第一步创建好的实例的execute 方法来执行第二部中创建好的method实例
			HttpResponse response = client.execute(httpPost);// 相当于在浏览器敲回车
			// 4.读response
			if (response.getStatusLine().getStatusCode() == 200) {
				InputStream is = response.getEntity().getContent();// 读取实体中的内容
				String result = StreamTools.streamToStr(is);
				System.out.println("--------------" + result);

				// 6.对得到后的内容进行处理
				Message msg = new Message();// 创建消息
				msg.what = CHANGETEXT;// 消息标识
				msg.obj = result;// 消息内容
				handler.sendMessage(msg);// 发送消息
			}

		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			// 5.释放连接。无法执行方法是否成功,都必须释放链接
			client.getConnectionManager().shutdown();
		}

	}

}

赵雅智_HttpClient的 get请求和post请求

时间: 2024-10-07 17:51:59

赵雅智_HttpClient的 get请求和post请求的相关文章

赵雅智:android教学大纲

带下划线为具体内容链接地址,点击后可跳转,希望给大家尽一些微薄之力,目前还在整理中 教学章节 教学内容 学时安排 备注 1 Android快速入门 2 Android模拟器与常见命令 3 Android用户界面设计 4 Android网络通信及开源框架引用 5 线程与消息处理 6 数据存储及访问 7 Android基本单元应用activity 8 Android应用核心Intent 9 资源访问 10 ContentProvider实现数据共享 11 BroadcastReceiver 12 S

赵雅智_android http get请求

<!-- 添加网络访问权限 --> <uses-permission android:name="android.permission.INTERNET"/> 布局文件 activity_login.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content&q

赵雅智_android使用adb命令详解附图

adb是一个客户端-服务器端程序,其中客户端是你用来操作的电脑,服务器端是android设备 我们除了用可视化窗口中操作也可以采用cmd命令行进行操作. 在开始菜单的搜索栏中输入cmd打开命令行 在本地找到adb.exe路径(如图1.1),把adb.exe拖到cmd命令行敲击回车显示所有可操作帮助示例(如图1.2). 图1.1 adb.exe路径 图1.2 adb命令示例 如果不输入adb的正确路径就不能进行正常显示,如图1.3: 图1.3adb未能正确打开 为了保证adb在任何路径下都能使用,

赵雅智_Android短信发送器

注意要点: 1)必须要在AndroidManifest.xml中添加发送短信权限<uses-permission android:name="android.permission.SEND_SMS" /> 设置视图:setContentView(R.layout.布局xml文件); 2)查找控件:findViewById(R.id.控件id); 3)监听按钮事件:控件.setOnClickListener(this),实现OnClickListener接口 4)获取edit

赵雅智_android实例_当监听类有数据更新时下拉刷新

之前两篇文章分别介绍了OnScrollListener的实现和ContentProvider监听数据的变化,下面我们就结合者两个知识点实现一个小项目 项目需求 使用当ContentProvider监听类有数据更新时,在当前界面进行提示,并用OnScrollListener实现下拉刷新 实现效果 通过ContentProvider显示数据在界面 当监听类发生变化时 下拉刷新后显示数据 实现步骤 android_sqlite项目 定义操作标识 匹配结果码 继承ContentProvider类重写方法

赵雅智_Intent传值

Intent简介 Android基本的设计理念是鼓励减少组件间的耦合,因此Android提供了Intent (意图) ,Intent提供了一种通用的消息系统,它允许在你的应用程序与其它的应用程序间传递Intent来执行动作和产生事件.使用Intent可以激活Android应用的三个核心组件:活动.服务和广播接收器. 在一个Activity中可以使用系统提供的startActivity(Intent intent)方法打开新的Activity,在打开新的Activity前,你可以决定是否为新的Ac

赵雅智_activity生命周期

Activity有三个状态 运行状态 当它在屏幕前台时(位于当前任务堆栈的顶部),它是激活或运行状态.它就是响应用户操作的Activity. 暂停状态 当它失去焦点但仍然对用户可见时,它处于暂停状态.即在它之上有另外一个Activity.这个Activity也许是透明的,或者没有完全覆盖全屏,所以被暂停的Activity仍对用户可见.暂停的Activity仍然是存活状态(它保留着所有的状态和成员信息并保持和窗口管理器的连接),但系统处于极低内存时仍然可以杀死这个Activity. 停止状态 完全

赵雅智_java多线程下载

简介 线程可以理解为下载的通道,一个线程就是一个文件的下载通道,多线程也就是同时开起好几个下载通道.当服务器提供下载服务时,使用下载者是共享带宽的,在优先级相同的情况下,总服务器会对总下载线程进行平均分配.不难理解,如果你线程多的话,那下载的越快.现流行的下载软件都支持多线程. 注意:实现多线程的条件是服务器支持单一IP多线程下载,如果不支持的话,很有可能封IP或者是只有一个线程能连接成功,多余线程被屏蔽.部分软件提供"用代理下载"方式,这种方式不会封IP. 原理 通常服务器同时与多个

赵雅智_android多线程下载带进度条

progressBar说明 在某些操作的进度中的可视指示器,为用户呈现操作的进度,还它有一个次要的进度条,用来显示中间进度,如在流媒体播放的缓冲区的进度.一个进度条也可不确定其进度.在不确定模式下,进度条显示循环动画.这种模式常用于应用程序使用任务的长度是未知的. XML重要属性 android:progressBarStyle:默认进度条样式 android:progressBarStyleHorizontal:水平样式 progressBar重要方法 getMax():返回这个进度条的范围的