码迷,mamicode.com
首页 > 移动开发 > 详细

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

时间:2015-07-21 07:53:26      阅读:150      评论:0      收藏:0      [点我收藏+]

标签:android课程

一、提交数据

    手机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,因为它可以设置请求头的参数信息。


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

    待进一步理解   

本文出自 “行意天下” 博客,请务必保留此出处http://4259297.blog.51cto.com/4249297/1676565

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

标签:android课程

原文地址:http://4259297.blog.51cto.com/4249297/1676565

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!