Android Day05-网络编程之提交数据

一、提交数据

手机App向服务器提交数据原理与web页面向服务器提交数据的原理是一样的,都是依赖于Http协

议,只是使用的API不一样而已。

Android最常见的提交数据的类有3个:HttpURLConnection、HttpClient、AsyncHttpClient,它

们都分get和post两种提交方式其中HttpURLConnection是SDK自带的类;HttpClient本来是第3方开源

项目,不过被google纳入了SDK;AsyncHttpClient是一个使用起来特别简单的第3方开源项目,需要去

GitHub下载jar包。

我将6种不同的提交方式整合到了一起,App UI界面如下:

以下是6种不同方式提交数据的源代码:

1)URLGet方式

URLGet的特点就是直接将请求参数拼接到提交地址的后面

        // 1-以URLGet方式登陆
	public void loginByURLGet() {
		new Thread() {
			public void run() {
				// 如果用户名和账号不为空
				if (checkEmpty()) {
					// 已经得到用户名密码,直接拿过来用就行了。
					String servletPath = "http://192.168.17.71/QQCenter/login";

					// 拼接地址(*********重要步骤*************)
					String urlPath = servletPath + "?username=" + username
							+ "&password=" + password;

					try {
						// 第1步:创建URL
						URL url = new URL(urlPath);

						// 第2步:创建HttpURLConnection连接
						HttpURLConnection conn = (HttpURLConnection) url
								.openConnection();

						// 第3步:设置请求参数
						conn.setRequestMethod("GET");
						conn.setReadTimeout(5);

						// 第4步:得到响应码
						int responseCode = conn.getResponseCode();

						// 第5步:判断响应码
						if (responseCode == 200) {
							// 获取服务器端的返回信息
							InputStream in = conn.getInputStream();
							String content = NetUtils.readStream(in);
							showToast(content);
							System.out.println("URLGet方式登陆");
						} else {
							showToast("服务器找不到资源");
						}
					} catch (Exception e) {
						e.printStackTrace();
						showToast("服务器忙!!!");
					}

				}
			}
		}.start();
	}

2)URLPost方式

URLPost的特点就是将提交的参数通过流写到服务器,相比URLGet方式,要多设两个头信

息,且设置向服务器写入流的权限。

        public void loginByURLPost() {
		new Thread() {
			public void run() {
				// 如果用户名和账号不为空
				if (checkEmpty()) {
					// 已经得到用户名密码,直接拿过来用就行了。
					String servletPath = "http://192.168.17.71/QQCenter/login";

					//要写入请求体的参数(*******关键步骤********)
					String data = "username=" + username + "&password="
							+ password;

					try {
						// 第1步:创建URL
						URL url = new URL(servletPath);

						// 第2步:创建HttpURLConnection连接
						HttpURLConnection conn = (HttpURLConnection) url
								.openConnection();

						// 第3步:设置请求参数
						conn.setRequestMethod("POST");
						conn.setReadTimeout(5);
						// 注意设置两个请求头信息(*****关键步骤*****)
						conn.setRequestProperty("Content-Type",
								"application/x-www-form-urlencoded");
						conn.setRequestProperty("Content-Length", data.length()
								+ "");

						// 设置向服务器写入流的权限(****关键步骤***)
						conn.setDoOutput(true);
						//得到输出流向服务器发送请求体数据(*****关键步骤******)
						OutputStream out = conn.getOutputStream();
						out.write(data.getBytes());
						out.close();
						// 第4步:得到响应码
						int responseCode = conn.getResponseCode();

						// 第5步:判断响应码
						if (responseCode == 200) {
							// 获取服务器端的返回信息
							InputStream in = conn.getInputStream();
							String content = NetUtils.readStream(in);
							showToast(content);
							in.close();
							System.out.println("以URLPost方式登陆");
						} else {
							showToast("服务器找不到资源");
						}
					} catch (Exception e) {
						e.printStackTrace();
						showToast("服务器忙!!!");
					}

				}
			}
		}.start();
	}

3)ClientGet方式

HttpClient这个类,相比HttpURLConnection语法上有很多的不同。将请求和响应单独封装

成了一个类。获取服务器数据是经过多层包装的,需要先得到数据的实体HttpEntity,根据实体

再得到服务器的输出流。

        public void loginByClientGet() {
		new Thread() {
			public void run() {
				// 如果用户名和账号不为空
				if (checkEmpty()) {
					// 已经得到用户名密码,直接拿过来用就行了。
					String servletPath = "http://192.168.17.71/QQCenter/login";

					// 拼接地址
					String data = "username=" + username + "&password="
							+ password;
					String url = servletPath + "?" + data;

					try {
						// 第1步:创建HttpClient对象
						HttpClient client = new DefaultHttpClient();
						// 第2步:创建get请求对象
						HttpGet get = new HttpGet(url);
						// 第3步:执行get请求对象,得到response对象。
						HttpResponse response = client.execute(get);

						// 第4步:得到响应码
						int responseCode = response.getStatusLine()
								.getStatusCode();

						// 第5步:判断响应码
						if (responseCode == 200) {
							// 获取服务器端的返回信息 与 URL不同,先获取的是数据实体。
							HttpEntity entity = response.getEntity();
							// 从数据实体中得到服务的输出流
							InputStream in = entity.getContent();
							String content = NetUtils.readStream(in);
							showToast(content);
							in.close();
							System.out.println("以ClientGet方式登陆");
						} else {
							showToast("服务器找不到资源");
						}
					} catch (Exception e) {
						e.printStackTrace();
						showToast("服务器忙!!!");
					}

				}
			}
		}.start();
	}

4)ClientPost方式

相对ClientGet方式,这种方式提交数据稍微有些复杂。创建post请求的实体数据时,要经

过多层包装。

            public void loginByClientPost() {
		new Thread() {
			public void run() {
				// 如果用户名和账号不为空
				if (checkEmpty()) {
					// 已经得到用户名密码,直接拿过来用就行了。
					String servletPath = "http://192.168.17.71/QQCenter/login";

					// 请求体数据
					String data = "username=" + username + "&password="
							+ password;
					String url = servletPath;
					try {
						// 第1步:创建HttpClient对象
						HttpClient client = new DefaultHttpClient();
						// 第2步:创建post请求对象
						HttpPost post = new HttpPost(url);
						// 将请求参数封装到实体------过程稍微有点复杂
						List<NameValuePair> listPairs = new ArrayList<NameValuePair>();                          //注意name的值与服务器应统一  
						NameValuePair pair1 = new BasicNameValuePair(
								"username", username);
						NameValuePair pair2 = new BasicNameValuePair(
								"password", password);
						listPairs.add(pair1);
						listPairs.add(pair2);
						HttpEntity postDataEntity = new UrlEncodedFormEntity(
								listPairs);
						post.setEntity(postDataEntity);
						// 第3步:执行post请求
						HttpResponse response = client.execute(post);
						// 第4步:得到状态码
						int statusCode = response.getStatusLine()
								.getStatusCode();
						// 第5步:判断状态码
						if (statusCode == 200) {
							// 得到数据的实体
							HttpEntity respEntity = response.getEntity();
							// 从实体得到流
							InputStream in = respEntity.getContent();
							String content = NetUtils.readStream(in);
							showToast(content);
							in.close();
							System.out.println("以ClientPost方式登陆");
						} else {
							showToast("找不到资源");
						}
					} catch (Exception e) {
						e.printStackTrace();
						showToast("服务器忙!!!");
					}

				}
			};
		}.start();

	}

5)AsyncHttpClientGet方式

在使用这个类之前,去GitHub下载并导一下这个包com.loopj.android.http到项目的src目

录下。使用AsyncHttpClient还有一个十分爽的地方,就是这个类不需要使用在子线程中,那么

也就可以直接更新UI。请求地址就直接写servlet了,也不用拼接参数了,因为参数都写在了

RequestParams对象中去了。

        public void loginByAsyncHttpClientGet() {
		// 如果用户名和账号不为空
		if (checkEmpty()) {
			// 已经得到用户名密码,直接拿过来用就行了。
			String servletPath = "http://192.168.1.109/QQCenter/login";

			try {
				AsyncHttpClient asyncHttpClient = new AsyncHttpClient();
				//创建get请求参数
				 RequestParams params = new RequestParams();
				 params.put("username", username);
				 params.put("password", password);

				asyncHttpClient.get(getApplicationContext(), servletPath, params, new AsyncHttpResponseHandler(){

					//请求成功
					@Override
					public void onSuccess(int statusCode, Header[] headers,
							byte[] responseBody) {
						if(statusCode == 200)
						{
							//得到服务器的返回值 
							String content = new String(responseBody);
							Toast.makeText(getApplicationContext(), content, 0).show();
							System.out.println("AsyncHttpClientGet方式登陆");
						}
						else
						{
							Toast.makeText(getApplicationContext(), "找不到资源", 0).show();
						}
					}

					@Override
					public void onFailure(int statusCode, Header[] headers,
							byte[] responseBody, Throwable error) {
						// TODO Auto-generated method stub

					}

				});
			} catch (Exception e) {
				e.printStackTrace();
				showToast("服务器忙!!!");
			}

		}
	}

6)AsyncHttpClientPost方式

和AsyncHttpClientGet方式相差无几,调用的是post方法。其它的一样

          public void loginByAsyncHttpClientPost() {
			// 如果用户名和账号不为空
			if (checkEmpty()) {
				// 已经得到用户名密码,直接拿过来用就行了。
				String servletPath = "http://192.168.17.71/QQCenter/login";
				try {
					//创建AsyncHttpClient对象
					AsyncHttpClient asyncHttpClient = new AsyncHttpClient();
					 RequestParams params = new RequestParams();
					 params.put("username", username);
					 params.put("password", password);
					asyncHttpClient.post(getApplicationContext(), servletPath, params, new AsyncHttpResponseHandler(){

						@Override
						public void onSuccess(int statusCode, Header[] headers,
								byte[] responseBody) {
							if(statusCode == 200)
							{
								//得到服务器的返回值 
								String content = new String(responseBody);
								Toast.makeText(getApplicationContext(), content, 0).show();
								System.out.println("AsyncHttpClientPost方式登陆");
							}
							else
							{
								Toast.makeText(getApplicationContext(), "找不到资源", 0).show();
							}
						}

						@Override
						public void onFailure(int statusCode, Header[] headers,
								byte[] responseBody, Throwable error) {

						}

					});

				} catch (Exception e) {
					e.printStackTrace();
					showToast("服务器忙!!!");
				}
			}
		}

提交数据的方式,这么多种,怎么使用呢?

HttpClient已被AsyncHttpClient所替代,一般开发都用后者。但是遇到特殊需求时,还是需要

用到最基础的HttpURLConnection,因为它可以设置请求头的参数信息。

二、提交数据时中文乱码问题

待进一步理解

时间: 2024-08-05 07:57:42

Android Day05-网络编程之提交数据的相关文章

Android网络编程之传递数据给服务器(二)

Android网络编程之传递数据给服务器(二) 请尊重他人的劳动成果,转载请注明出处:Android网络编程之传递数据给服务器(二) 我曾在<Android网络编程之传递数据给服务器(一)> 一文中介绍了如何通过GET方式传递数据给服务器,通过GET方式传递数据主要适用于数据大小不超过2KB,且对安全性要求不高的情况下.下面就介绍通过POST方式传递数据主到服务器. 一.通过Post方式传递数据给服务器 通过Post方式传递数据给服务器是Android应用程序开发提交数据给服务器的一种主要的方

Android网络编程之传递数据给服务器(一)

Android网络编程之传递数据给服务器(一) 请尊重他人的劳动成果,转载请注明出处:Android网络编程之传递数据给服务器(一) 因为Android程序需要和服务器进行通信,所以需要服务器端提供的支持. 一.通过GET方式传递数据给服务器 通过GET方式上传数据主要适用于数据大小不超过2KB,且对安全性要求不高的情况下. 1.创建服务器端: 服务器端项目结构: 第一步:创建控制器Servlet package com.jph.sgm.servlet; import java.io.IOExc

Android 的网络编程

android的网络编程分为2种:基于socket的,和基于http协议的. 基于socket的用法 服务器端: 先启动一个服务器端的socket     ServerSocket svr = new ServerSocket(8989); 开始侦听请求 Socket s = svr.accept(); 取得输入和输出 DataInputStream dis = new DataInputStream(s.getInputStream()); DataOutputStream dos = new

网络编程练习 -- POST-JSON数据

LWTViewController.m // // LWTViewController.m // 网络编程练习 -- POST-JSON数据 // // Created by apple on 14-7-2. // Copyright (c) 2014年 lwt. All rights reserved. // #import "LWTViewController.h" @interface LWTViewController () @end @implementation LWTVi

Android利用网络编程HttpClient批量上传(一个)

请尊重他人的劳动成果.转载请注明出处:Android网络编程之使用HttpClient批量上传文件 我曾在<Android网络编程之使用HTTP訪问网络资源>一文中介绍过HttpCient的使用,这里就不在累述了,感兴趣的朋友能够去看一下.在这里主要介绍怎样通过HttpClient实现文件上传. 1.预备知识: 在HttpCient4.3之前上传文件主要使用MultipartEntity这个类,但如今这个类已经不在推荐使用了. 随之替代它的类是MultipartEntityBuilder. 以

Android中网络编程以及与服务器上Web项目的基础交互

该博文中内容通过老师上课的内容对于Android下的网络通信编程等内容进行总结: 1.Android网络编程初识 2.Android实现HTML源码查看 3.Android实现网络图片查看 4.Android实现与服务器上JavaWeb项目交互 1.Android网络编程初识 Android手机终端作为客户端发送Http请求到终端服务器上,并且当发送请求到服务器,如果请求成功,响应码:200:服务器会通过客户端返回请求并且处理后的信息数据,一般情况下,在正式项目中多用JSON,不会使用没有规定格

IOS开发之网络编程(请求数据和断点续传)

IOS开发中网络编程应用场景:JSON数据获取,网络数据的下载. 一:请求JSON数据一般用异步请求的方式,如果用同步请求,则会造成IOS界面的执行过程阻塞,即界面部分在请求数据的过程中必须等待数据加载完毕. JSON数据的获取步骤: 1.设置网络地址的字符串:NSString *URLString = @"http://www.baidu.com"; 2.创建URL:NSURL *URL = [NSURL URLWithString:URLString]; 3.创建请求:NSURLR

android之网络编程

注意: (1)主线程不能够做耗时的操作,网络请求就是耗时的操作需要放到子线程做. (2)子线程不能更新控件的内容(更新Ui).所以产生了矛盾,解决办法就是使用Handler(处理消息机制). Handler:消息机制的写法(重要)  使用Handler的步骤: 1.主线程中创建一个Handler private Handler handler = new Handler(){ public void handleMessage(android.os.Message msg) { }; }; 2.

iOS开发——网络编程OC篇&amp;数据请求总结

数据请求总结 1 //**************************************GET 2 //同步 3 /* 4 //第一步,创建URL 5 NSURL * url = [[NSURL alloc]initWithString:@"http://e.hiphotos.baidu.com/image/w%3D1366%3Bcrop%3D0%2C0%2C1366%2C768/sign=66f9b9980ef431adbcd2473a7d0097cc/08f790529822720