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

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的多线程断点下载应用程序

分享到:
评论

相关推荐

    实验六、数据存储和访问(一).docx

    android studio应用程序开发作业,实验数据存储和访问。1、制作启动界面如下图所示 2、选择“教师”,点击“登录”按钮,使用保存在SharedPreferences里的帐号信息验证用户名和密码。登录成功后跳转到如下界面。

    Android手机交互应用开发创意之钥 源代码

     第10章 数据存储  10.1 shared preferences  第11章 无线网络通信  11.1 初认识无线局域网  11.2 socket通信  11.3 android与javaschpt交互  第2章 goog-emap与gps  12.1 初认识google map api  12.2 申请...

    Android Studio DuDuMusic实例及源码 音乐播放器实现SQLite用户注册登录 管理员服务器数据交互

    3.实现了管理员登录,使用的是与Tomcat服务器进行数据交互验证信息的正确性,我使用的是myeclipse进行布置的服务器信息,此时使用的是SQLserver 2008 数据库存储的管理员的信息,读取完以后然后返回到管理界面 ...

    在Unity中获取Android系统的Sensor数据.zip

    6. 数据存储:Android 提供了多种数据存储方式,包括 SQLite 数据库、文件存储、SharedPreferences 等。 7. 网络通信:Android 支持多种网络通信方式,包括 HTTP、TCP、UDP 等。 8. 社交媒体集成:Android 提供了...

    基于Android studio实现的安卓锻炼跑步app源码,使用安卓自带的realm数据库来储存数据

    一款使用安卓自带的realm数据库来储存数据的锻炼跑步app,Realm自带数据库加密,需要64位字节数据进行加密。指定数据库的密钥后,用户可以安全地存储自己的锻炼数据,而且可以通过注销的方式来自己清除本地的数据,...

    NBA数据分析系统(Android客户端代码)- -.zip

    6. 数据存储:Android 提供了多种数据存储方式,包括 SQLite 数据库、文件存储、SharedPreferences 等。 7. 网络通信:Android 支持多种网络通信方式,包括 HTTP、TCP、UDP 等。 8. 社交媒体集成:Android 提供了...

    基于Electron的交通时空大数据分析挖掘系统客户端(Android).zip

    6. 数据存储:Android 提供了多种数据存储方式,包括 SQLite 数据库、文件存储、SharedPreferences 等。 7. 网络通信:Android 支持多种网络通信方式,包括 HTTP、TCP、UDP 等。 8. 社交媒体集成:Android 提供了...

    Android程序设计教程 (丁山 编) pdf

    本书大致可以分成两个部分,第一部分为基础篇,主要介绍Android操作系统概况、Android生命周期与组件通信、Android用户界面设计、Android数据存储与交互、Android后台服务与事件广播、媒介与网络、AndroidNDK,...

    Js与Native交互函数封装,适配了Android与iOS系统.zip

    Js与Native交互函数封装,适配了Android与iOS系统,模仿微信公众号jssdk,前端可以通过CDN方式引用Js文件 软件开发设计:PHP、QT、应用软件开发、系统软件开发、移动应用开发、网站开发C++、Java、python、web、C#等...

    《Android系统回顾(八):网络通信(三)》源码.zip

    6. 数据存储:Android 提供了多种数据存储方式,包括 SQLite 数据库、文件存储、SharedPreferences 等。 7. 网络通信:Android 支持多种网络通信方式,包括 HTTP、TCP、UDP 等。 8. 社交媒体集成:Android 提供了...

    基于Android的个人理财系统的设计与实现(源码+数据库+文档+截图).zip

    阐述了基于Android平台的个人理财软件的设计与实现过程,系统基于Android平台,采用Java语言开发,通过XML文档进行界面编程,并通过相应的Activity与后台Service实现指定功能,且实现了对数据的图形处理,数据存储与...

    android开发入门与实战(下)

    8.1 Android数据存储概述 8.2 轻轻地我保护——SharedPreferences存储 8.3 谁的文件,谁主宰——文件存储 8.4 打造自己的数据库存储——SQLite存储方式 8.4.1 Android中对数据库操作 8.4.2 完整地操作数据库——日记...

    Cinema Management System in Android(影院管理系统 Android 版).zip

    6. 数据存储:Android 提供了多种数据存储方式,包括 SQLite 数据库、文件存储、SharedPreferences 等。 7. 网络通信:Android 支持多种网络通信方式,包括 HTTP、TCP、UDP 等。 8. 社交媒体集成:Android 提供了...

    android签到系统.zip

    6. 数据存储:Android 提供了多种数据存储方式,包括 SQLite 数据库、文件存储、SharedPreferences 等。 7. 网络通信:Android 支持多种网络通信方式,包括 HTTP、TCP、UDP 等。 8. 社交媒体集成:Android 提供了...

    DataManagement:用于轻松存储对象的 Android 本地数据库库

    它消除了编写单独的类来管理数据库-对象交互的需要,并允许开发人员使用简单的方法来存储、查询、更新和删除对象。 该库能够存储类的所有对象,这些类的实例变量要么是原始数据类型,要么本身就是另一个可存储类的...

    小方便APP生活工具,纯Android原生开发支持Android9.0系统以上。.zip

    6. 数据存储:Android 提供了多种数据存储方式,包括 SQLite 数据库、文件存储、SharedPreferences 等。 7. 网络通信:Android 支持多种网络通信方式,包括 HTTP、TCP、UDP 等。 8. 社交媒体集成:Android 提供了...

    android系统 Gps模拟.zip

    6. 数据存储:Android 提供了多种数据存储方式,包括 SQLite 数据库、文件存储、SharedPreferences 等。 7. 网络通信:Android 支持多种网络通信方式,包括 HTTP、TCP、UDP 等。 8. 社交媒体集成:Android 提供了...

    Android Diary日记系统.zip

    6. 数据存储:Android 提供了多种数据存储方式,包括 SQLite 数据库、文件存储、SharedPreferences 等。 7. 网络通信:Android 支持多种网络通信方式,包括 HTTP、TCP、UDP 等。 8. 社交媒体集成:Android 提供了...

    Android系统 时钟 APP.zip

    6. 数据存储:Android 提供了多种数据存储方式,包括 SQLite 数据库、文件存储、SharedPreferences 等。 7. 网络通信:Android 支持多种网络通信方式,包括 HTTP、TCP、UDP 等。 8. 社交媒体集成:Android 提供了...

Global site tag (gtag.js) - Google Analytics