`
minghaitang
  • 浏览: 129087 次
社区版块
存档分类
最新评论

Android(五)数据存储之五网络数据交互 3

阅读更多

其中使用到的HttpRequester类:

package com.changcheng.web.client.service;

 

import java.io.DataOutputStream;

import java.io.InputStream;

import java.net.HttpURLConnection;

import java.net.URL;

import java.util.ArrayList;

import java.util.List;

import java.util.Map;

import org.apache.http.HttpResponse;

import org.apache.http.NameValuePair;

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.protocol.HTTP;

import org.apache.http.util.EntityUtils;

import android.util.Log;

 

/**

 * http请求发送器

 */

public class HttpRequester {

         /**

          * 直接通过HTTP协议提交数据到服务器,实现如下面表单提交功能:

          *   <FORM METHOD=POST ACTION="http://192.168.0.200:8080/ssi/fileload/test.do" enctype="multipart/form-data">

                            <INPUT TYPE="text" NAME="name">

                            <INPUT TYPE="text" NAME="id">

                            <input type="file" name="imagefile"/>

                       <input type="file" name="zip"/>

                    </FORM>

          * @param actionUrl 上传路径(注:避免使用localhost127.0.0.1这样的路径测试,因为它会指向手机模拟器,你可以使用http://www.itcast.cnhttp://192.168.1.10:8080这样的路径测试)

          * @param params 请求参数 key为参数名,value为参数值

          * @param file 上传文件

          */

         public static String post(String actionUrl, Map<String, String> params, FormFile[] files) {

             try {            

                 String BOUNDARY = "---------7d 4a6d158c9"; //数据分隔线

                 String MULTIPART_FORM_DATA = "multipart/form-data";

                

                 URL url = new URL(actionUrl);

                 HttpURLConnection conn = (HttpURLConnection) url.openConnection();

                 conn.setConnectTimeout(6* 1000);

                 conn.setDoInput(true);//允许输入

                 conn.setDoOutput(true);//允许输出

                 conn.setUseCaches(false);//不使用Cache

                 conn.setRequestMethod("POST");               

                 conn.setRequestProperty("Connection", "Keep-Alive");

                 conn.setRequestProperty("Charset", "UTF-8");

                 conn.setRequestProperty("Content-Type", MULTIPART_FORM_DATA + "; boundary=" + BOUNDARY);

 

                 StringBuilder sb = new StringBuilder();

                 for (Map.Entry<String, String> entry : params.entrySet()) {//构建表单字段内容

                     sb.append("--");

                     sb.append(BOUNDARY);

                     sb.append("\r\n");

                     sb.append("Content-Disposition: form-data; name=\""+ entry.getKey() + "\"\r\n\r\n");

                     sb.append(entry.getValue());

                     sb.append("\r\n");

                 }

                 DataOutputStream outStream = new DataOutputStream(conn.getOutputStream());

                 outStream.write(sb.toString().getBytes());//发送表单字段数据

                 for(FormFile file : files){//发送文件数据

                      StringBuilder split = new StringBuilder();

                          split.append("--");

                          split.append(BOUNDARY);

                          split.append("\r\n");

                          split.append("Content-Disposition: form-data;name=\""+ file.getFormname()+"\";filename=\""+ file.getFilname() + "\"\r\n");

                          split.append("Content-Type: "+ file.getContentType()+"\r\n\r\n");

                          outStream.write(split.toString().getBytes());

                          if(file.getInStream()!=null){

                               byte[] buffer = new byte[1024];

                               int len = 0;

                               while((len = file.getInStream().read(buffer))!=-1){

                                         outStream.write(buffer, 0, len);

                               }

                               file.getInStream().close();

                          }else{

                               outStream.write(file.getData(), 0, file.getData().length);

                          }

                          outStream.write("\r\n".getBytes());

                 }

                 byte[] end_data = ("--" + BOUNDARY + "--\r\n").getBytes();//数据结束标志       

                 outStream.write(end_data);

                 outStream.flush();

                 int cah = conn.getResponseCode();

                 if (cah != 200) throw new RuntimeException("请求url失败");

                 InputStream is = conn.getInputStream();

                 int ch;

                 StringBuilder b = new StringBuilder();

                 while( (ch = is.read()) != -1 ){

                      b.append((char)ch);

                 }

                 Log.i("ItcastHttpPost", b.toString());             

                 outStream.close();

                 conn.disconnect();

                 return b.toString();

             } catch (Exception e) {

                throw new RuntimeException(e);

             }

         }

        

         /**

          * 提交数据到服务器

          * @param actionUrl 上传路径(注:避免使用localhost127.0.0.1这样的路径测试,因为它会指向手机模拟器,你可以使用http://www.itcast.cnhttp://192.168.1.10:8080这样的路径测试)

          * @param params 请求参数 key为参数名,value为参数值

          * @param file 上传文件

          */

         public static String post(String actionUrl, Map<String, String> params, FormFile file) {

            return post(actionUrl, params, new FormFile[]{file});

         }

        

         /**

          * 提交数据到服务器

          * @param actionUrl 上传路径(注:避免使用localhost127.0.0.1这样的路径测试,因为它会指向手机模拟器,你可以使用http://www.itcast.cnhttp://192.168.1.10:8080这样的路径测试)

          * @param params 请求参数 key为参数名,value为参数值

          */

         public static String post(String actionUrl, Map<String, String> params) {

                      HttpPost httpPost = new HttpPost(actionUrl);

                      List<NameValuePair> list = new ArrayList<NameValuePair>();

                      for (Map.Entry<String, String> entry : params.entrySet()) {//构建表单字段内容

                               list.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));

                      }

                      try {

                            httpPost.setEntity(new UrlEncodedFormEntity(list, HTTP.UTF_8));

                            HttpResponse httpResponse = new DefaultHttpClient().execute(httpPost);

                            if(httpResponse.getStatusLine().getStatusCode() == 200){

                                     return EntityUtils.toString(httpResponse.getEntity());

                       }

                   } catch (Exception e) {

                            throw new RuntimeException(e);

                   }

                   return null; 

    }

}

       我们最好对HTTP协议有深入的了解,这样在编写简单数据交互应用时直接面向HTTP协议编程可以提高运行速度并减少资源的占用。

       我们在最后一个方法中使用到的HttpPost类,是Apache开源组织提供的httpcomponents-client-4.0.1包。httpcomponents-client-4.0.1可以实现浏览器的大部分功能,但如果我们能不使用它就尽量不使用它,因为这会造成对手机硬件资源的占用,从而减慢应用程序的运行速度。

 

       4.测试类

package com.changcheng.web.client.test;

 

import com.changcheng.web.client.service.ClientService;

import android.test.AndroidTestCase;

 

public class TestAndroidClientService extends AndroidTestCase {

 

         public void testSendDataToServerByGet() throws Throwable {

                   ClientService.sendDataToServerByGet();

         }

 

         public void testSendDataToServerByPost() throws Throwable {

                   ClientService.sendDataTOserverByPost();

         }

 

         public void testSendDataToServerByForm() throws Throwable {

                   ClientService.sendDataToServerByForm();

         }

}

 

 

       5.运行

       首先启动AndroidWebService应用程序,然后运行测试方法,查看运行结果。

 

       下一篇:Android的多线程断点下载应用程序

分享到:
评论

相关推荐

    android中不同app间数据交互(1、简单一次性数据交互)demo

    在Android系统中,不同应用程序之间的数据交互是一个常见的需求,例如社交应用分享内容到其他应用,或者从浏览器打开一个链接在地图应用中查看。本篇主要介绍Android中简单的一次性数据交互,即如何通过Intent机制...

    Android数据存储SQLite.docx

    Android 数据存储 SQLite Android 数据存储是 Android 应用程序中的一个重要组件,它负责存储和管理应用程序中的数据。在 Android 中,有多种数据存储方式,包括 SharedPreferences、内部文件存储、SD 卡存储和 ...

    Android客户端与服务器端的json数据交互(内含大量知识点)

    在Android应用开发中,客户端与服务器端的数据交互是不可或缺的一部分,JSON作为一种轻量级的数据交换格式,被广泛用于Android和服务器之间的通信。本主题将深入探讨Android客户端如何使用JSON进行数据交互,包括...

    Android与JSP数据交互

    在IT行业中,Android和JSP的数据交互是移动应用开发中常见的技术组合,特别是在构建服务器-客户端架构的应用时。本文将详细讲解如何利用Android客户端通过HTTP协议与运行在J2EE平台上的服务器进行数据交换,以及如何...

    Android客户端和服务器端数据交互Demo01.zip

    在Android应用开发中,客户端与服务器之间的数据交互是不可或缺的一部分,它使得应用程序能够获取最新的信息、存储用户数据或实现各种在线功能。这个"Android客户端和服务器端数据交互Demo01.zip"应该包含一个示例...

    android 数据存储之 Network

    "android 数据存储之 Network"这个主题主要关注如何在Android应用中有效地管理和存储从网络获取的数据。在这个话题中,我们将深入探讨几种常见的数据存储方法以及它们在网络数据处理中的应用场景。 1. **Shared ...

    Android本地数据存储之文件存储读写

    在Android应用开发中,本地数据存储是至关重要的一个环节,特别是在处理用户数据或者应用程序需要持久化数据时。本文将深入探讨Android系统中的文件存储机制,包括如何读取、写入、重写和删除.txt格式的文件。理解...

    Android客户端与服务器数据交互流程.pdf

    Android客户端与服务器数据交互是移动应用开发中的关键环节,它涉及到网络通信、数据传输、请求响应等多个方面。在这个过程中,客户端通常通过HTTP协议与服务器进行通信,HTTP协议基于TCP/IP协议,确保数据的可靠...

    android数据访问与存储

    本章节将深入探讨Android中常见的数据存储方式,包括内部存储、外部存储、SQLite数据库、SharedPreferences、ContentProvider以及网络存储等。 首先,内部存储是Android为每个应用提供的私有存储空间,数据对其他...

    Android客户端和服务器端数据交互Demo04.zip

    在Android开发中,客户端与服务器端的数据交互是应用程序的核心功能之一。这个名为"Android客户端和服务器端数据交互Demo04.zip"的压缩包文件很可能是为了演示如何在Android应用中实现这种交互。以下是对这个主题的...

    android网络操作

    在Android平台上进行网络操作是应用程序开发中的重要环节,它允许应用与远程服务器进行数据交互,如获取用户信息、上传下载文件、同步数据等。本文将深入探讨“Android网络操作”的核心概念、常用方法以及如何利用...

    Android应用源码之Android学习之数据存储

    在Android应用开发中,数据存储是一项至关重要的任务。Android提供了多种数据存储方式,以满足不同场景下的需求。本文将深入探讨Android应用中的数据存储...总的来说,这份源码将是你提升Android数据存储技能的好材料。

    使用USB数据线连接PC端和Android端进行数据的交互.rar

    3. **USB主机模式 (USB Host Mode)**:在某些Android设备上,可以通过USB OTG(On-The-Go)功能使Android设备作为USB主机,连接到USB设备(如键盘、鼠标或存储设备)并读写数据。这需要Android设备支持USB主机模式,...

    Android客户端与服务器通信+json交互数据

    综上所述,Android客户端与服务器通信并使用JSON进行数据交互是一个涉及网络编程、JSON处理、服务器框架理解等多个层面的复杂过程。在实际开发中,需要对每个环节都有深入的理解,才能有效地实现客户端与服务器的...

    Android 数据存储技术

    在Android开发中,数据存储是不可或缺的一部分,它允许应用程序持久保存和检索数据。本文将深入探讨Android的数据存储技术,包括几种主要的存储方式及其应用场景。 首先,我们有共享首选项(SharedPreferences)。...

    AndRoid五种存储方式

    下面将详细讲解这五种Android数据存储方式。 1. 文件存储: 文件存储是最基础的存储方式,适用于保存大量的文本、图片、音频等原始数据。Android提供`openFileOutput`和`openFileInput`方法,它们位于`Context`类...

    Android与服务器交互

    以上就是Android应用与服务器交互的基本知识点,涵盖了从网络请求到数据处理的整个流程。通过学习和实践,开发者可以构建出高效、稳定的客户端-服务器应用程序。在实际项目中,还可能涉及到更多高级概念,如数据缓存...

    Android手机访问服务器的一种数据交互方法

    在移动互联网时代,Android作为主流的移动操作系统之一,在其应用程序开发过程中,与服务器进行高效稳定的数据交互是至关重要的。本文将详细解析一种适用于Android设备与服务器之间数据交互的方法,并结合具体的技术...

Global site tag (gtag.js) - Google Analytics