`
longgangbai
  • 浏览: 7340582 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Android+REST WebService服务方式手机开发

 
阅读更多

    最近项目中采用Apache CXF 的REST 方式发布WebService实现,Android手机后台服务的开发,以下以简单是实例实现。

在项目中采用Android+REST WebService服务方式开发的手机平台很少采用 soap协议这种方式,主要soap协议解析问题,增加了代码量。  采用RESTFull 方式开发WebService的好处,相对SOAP协议的WebService来说,比较简单。同时简化了在手机解析工作,减轻了手机端的压力,提高了手机响应的效率。

 

手机后台服务:

package com.easyway.rest.ws;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
/**
 * 服务端发布一个简单的WebService服务
 * 在手机端接受服务端发送的信息.
 *  使用 Apache HttpClient 库访问 JAX-RS web 服务。Jersey 是 JAX-RS 
 *  的参考实现,它简化了 Java™ 环境下的 RESTful Web 服务的开发。Android 
 *  是一款流行的智能手机,本文将展示如何为 Android 创建一个 JAX-RS 客户端。
 *  您将创建一个访问 JAX-RS Web 服务的 Apache HttpClient 库客户端。
 *  JAX-RS必须的jar:
 *  	jersey-bundle-1.8.jar,jersey-server-1.10.jar,jsr311-api-1.1.1.jar
 *      asm-3.1.jar
 *  使用一个 root 资源类创建一个 RESTful Web 服务资源。root 资源类是带有 @PATH 
 *  注释的 POJO。它包含至少一个带注释的方法,该注释为 @PATH、@GET、@PUT、@POST
 *   或 @DELETE。 
 *   
 *   在服务器上,按照 web.xml 的指定,init 参数 com.sun.jersey.config.property.resourceConfigClass 
 *   作为 com.sun.jersey.api.core.PackagesResourceConfig 启动,而 init 参数
 *    com.sun.jersey.config.property.packages 作为 com.easyway.rest.ws 启动。
 *    找到 root 资源类 com.easyway.rest.ws.HelloWorldResource。
 *    
 *  备注:如果采用jersey发布JAXRS服务需要配置:
 *  <pre>
 *   <servlet>
*    <description>JAX-RS</description>
*    <servlet-name>JAX-RS-Servlet</servlet-name>
*    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
*    <init-param>
*        <param-name>com.sun.jersey.config.property.resourceConfigClass</param-name>
*        <param-value>com.sun.jersey.api.core.PackagesResourceConfig</param-value>
*    </init-param>
*    <init-param>
*        <param-name>com.sun.jersey.config.property.packages</param-name>
*        <param-value>com.easyway.rest.ws</param-value>
*    </init-param>
*    <load-on-startup>1</load-on-startup>
*  </servlet>
*  <servlet-mapping>
*    <servlet-name>JAX-RS-Servlet</servlet-name>
*    <url-pattern>/services/*</url-pattern>
*  </servlet-mapping>
 *  
 *  </pre>
 *    
 * @author longgangbai
 *
 */
@Path("/helloworld")
public class HelloWorldResource {
	/**
	 * 一个简单的文本信息
	 * @return
	 */
     @GET
     @Produces(MediaType.TEXT_PLAIN)
     public String getClichedMessage() {
     return "Hello Android";
     }
}
 

 

web.xml配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>JAXRSWebService</display-name>
<servlet>
    <description>JAX-RS</description>
    <servlet-name>JAX-RS-Servlet</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>com.sun.jersey.config.property.resourceConfigClass</param-name>
        <param-value>com.sun.jersey.api.core.PackagesResourceConfig</param-value>
    </init-param>
    <init-param>
        <param-name>com.sun.jersey.config.property.packages</param-name>
        <param-value>com.easyway.rest.ws</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>JAX-RS-Servlet</servlet-name>
    <url-pattern>/services/*</url-pattern>
  </servlet-mapping>
</web-app>
 

 

 

注意如果没有 Resource 将会报如下异常:
com.sun.jersey.api.container.ContainerException: The ResourceConfig instance does not contain any root resource classes.

 

手机前台服务:

package com.easyway.rest.ws;

import java.io.IOException;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;

import android.app.Activity;
import android.os.Bundle;
import android.os.StrictMode;
import android.widget.TextView;
/**
 * Android平台主要提供了四种数据存储方式:Shared Preferences、文件存储、Sqlite存储和网络存储。其中:
      1)Shared Preferences 一个轻量级的键-值存储机制,专门用于存储键-值对数据,并且仅可以存储基本的数据类型
                        (boolean、int、long、float和String);通常使用它来存储应用程序的配置信息。
      2)文件存储 通过FileInputStream和FileOutputStream对文件进行操作,在Android中,文件是一个应用程序私有的,
       一个应用程序无法读写其它应用程序的文件。
      3)SQLite存储 SQLite是一款轻型的数据库,支持标准SQL。它的设计目标是嵌入式的,占用资源非常的低,在嵌入式设备中,
          只需要几百K的内存就够了。Android平台也为我们提供了SQLite数据库。
      4)网络存储 以上3种方式数据均存储在手机上,而网络存储的数据是存储在远程服务器上,手机客户端通过联接到网络来存储和获取数据。

      今天要讲解的HttpClient正是常用的网络存储工具之一。记得最早接触HttpClient是在两年前,当时要做一个垂直搜索引擎,
      数据自然是来源于互联网,通过一个爬虫系统不断从指定网站上爬取感兴趣的数据,然后通过Lucene搜索引擎框架实现海量数据
      的快速检索。而爬虫系统最开始是想采用开源的爬虫框架Heritrix来实现,但接触一段时间后发现Heritrix过于庞大,而且是作
      为一个独立的系统运行,不方便嵌入到现有的系统中,再加上学习成本高,最后还是选择了“HttpClient + HtmlParser”来实现的
      小型爬虫系统;其中HttpClient可以模拟HTTP的POST和GET请求,用于从指定网站获取网页数据,而HtmlParser用于解析爬取到
      的页面,过滤HTML标记,取得最终数据。
      是不是发现HttpClient还挺强大的?让我们看看它是什么来头。"HttpClient 是 Apache Jakarta Common 下的子项目,可以用来
      提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议"。如果你以前没
      有接触过HttpClient,那么你只需要简单记住两点就可以了:
          1)HttpClient是一个HTTP协议开发包;
          2)HttpClient不是Android的专利。

      HttpClient的功能介绍:
            1)实现了HTTP请求的所有方法(如GET、POST、PUT、HEAD 等);
            2)支持自动转向;
            3)支持 HTTPS 协议;
            4)支持代理服务器等
      HttpClient的基本使用(以POST请求为例):
            1)创建HttpClient实例(类似于浏览器客户端);
                        HttpClient client = new DefaultHttpClient();
            2)创建HttpPost请求,需要向HttpPost的构造方法传入所请求的URL;
                        HttpPost post = new HttpPost(requestUrl);
            3)发出POST请求(调用HttpClient的execute()方法,execute()的参数为HttpPost实例);
                        HttpResponse response = client.execute(post);
            4)读取返回结果;
            5)释放连接;
            6)对返回的结果进行处理。

      在Android平台上使用HttpClient,并不需要添加额外的jar包,因为Android平台吸收了许多优秀的开源框架,其中就包括HttpClient,
      下面就来看一个Android平台使用HttpClient的例子。
备注:是不是发现HttpClient很容易使用呢?其实,上面所讲解的只是HttpClient最基本的功能(发起POST请求);我们在浏览器客户端
所执行的大多数操作HttpClient都能够模拟,例如:提交表单、查询数据、上传下载文档、页面跳转、Session存储等。比如大家经
常玩“抢车位”、“偷菜”,就可以通过HttpClient编程自动实现。


 * 
 * 
 * 客户端通过Apache HttpClient调用JAXRS WebService的服务。
 * 为 Android 开发访问 JAX-RS Web 服务的 Apache HttpClient 客户端.
 * 
 * 备注:在访问本机的JAXRS Web服务的时候不能使用localhost或者127.0.0.1,
 *    因为android模拟机会调用自身的linux内核操作系统,所以可能找不到相关的服务。
 *    最好填写ip地址如下:
 *       "http://192.168.134.1:8080/JAXRSWebService/services/helloworld";
 *
 * @author longgangbai
 *
 */
public class AndroidJAXRSWebServiceActivity extends Activity {
    private static final String processURL="http://192.168.134.1:8080/JAXRSWebService/services/helloworld";
	private TextView txResult;
	
    /**
     *  Called when the activity is first created.
     */
    @Override
    public void onCreate(Bundle savedInstanceState) {
    	///在Android2.2以后必须添加以下代码
		//本应用采用的Android4.0
		//设置线程的策略
		 StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()   
         .detectDiskReads()   
         .detectDiskWrites()   
         .detectNetwork()   // or .detectAll() for all detectable problems   
         .penaltyLog()   
         .build());   
		//设置虚拟机的策略
		  StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()   
		         .detectLeakedSqlLiteObjects()   
		         //.detectLeakedClosableObjects()   
		         .penaltyLog()   
		         .penaltyDeath()   
		         .build());

        super.onCreate(savedInstanceState);
        //设置UI布局
        setContentView(R.layout.main);
        //获取结果显示文本框
        txResult=(TextView)findViewById(R.id.tvresult);
        //获取JAXRS WebService的结果信息
        getJAXRSWebService();
    }
    
    /**
     * 获取JAXRS WebService的结果信息
     */
    public void getJAXRSWebService(){
    	 try {
    	//创建一个HttpClient对象
    	HttpClient httpclient = new DefaultHttpClient();
        //创建HttpGet对象
    	HttpGet request=new HttpGet(processURL);
    	//请求信息类型MIME每种响应类型的输出(普通文本、html 和 XML)。允许的响应类型应当匹配资源类中生成的 MIME 类型
    	//资源类生成的 MIME 类型应当匹配一种可接受的 MIME 类型。如果生成的 MIME 类型和可接受的 MIME 类型不 匹配,那么将
    	//生成 com.sun.jersey.api.client.UniformInterfaceException。例如,将可接受的 MIME 类型设置为 text/xml,而将
    	//生成的 MIME 类型设置为 application/xml。将生成 UniformInterfaceException。
    	request.addHeader("Accept","text/plain");
        //获取响应的结果
		HttpResponse response =httpclient.execute(request);
		//获取HttpEntity
		HttpEntity entity=response.getEntity();
		//获取响应的结果信息
		String result =EntityUtils.toString(entity);
		 txResult.setText(result);
    	 } catch (ClientProtocolException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
    }
}

 

 

 

 

分享到:
评论
14 楼 yigeyanse 2014-10-30  
如何发布webservice
13 楼 男人40 2014-03-21  
很好 很强大
12 楼 longgangbai 2014-02-20  
JackingNo1 写道
楼主你好,刚接触REST服务这一块儿,参照你这个项目当前出现一个问题,总是在httpclient.execute(request)处抛出异常!不知为什么

异常是什么都不知道,你说异常我也没有办法,爱莫能助呀
11 楼 JackingNo1 2014-02-13  
楼主你好,刚接触REST服务这一块儿,参照你这个项目当前出现一个问题,总是在httpclient.execute(request)处抛出异常!不知为什么
10 楼 longgangbai 2013-04-24  
chenglnb 写道
你好 post怎么写 请指教

只需要将HttpGet修改为HttpPost而已,设置表单即可
9 楼 chenglnb 2013-04-24  
你好 post怎么写 请指教
8 楼 longgangbai 2012-12-13  
lee_dp30 写道
这个和servlet的请求有什么不一样呢??API???

其实REST WebService和Servlet的区别,还是很大的,有时候在手机上RestWebService可以替换为Serlvet,但是 他们还是不一样的。REST模式的详细请看
http://zh.wikipedia.org/zh-cn/REST
http://baike.baidu.com/view/1077487.htm
7 楼 lee_dp30 2012-12-12  
这个和servlet的请求有什么不一样呢??API???
6 楼 ivringl 2012-10-13  
谢谢发帖!
5 楼 longgangbai 2012-07-04  
gqs_Android 写道
longgangbai 写道
zjc198805 写道
lz,假如android端有图片需要提交,服务器端该怎么实现呢?用rest风格的webservice

采用Servlet实现即可,我们采用Servlet实现。

发送字节流不就可以吗

base64图片格式请查看一下目录:
http://topmanopensource.iteye.com/blog/1544126
4 楼 longgangbai 2012-07-04  
gqs_Android 写道
longgangbai 写道
zjc198805 写道
lz,假如android端有图片需要提交,服务器端该怎么实现呢?用rest风格的webservice

采用Servlet实现即可,我们采用Servlet实现。

发送字节流不就可以吗

如果你发送类似图片base64格式的字符串也是可以的,随便都可以。只是一种方案而已。
3 楼 gqs_Android 2012-07-04  
longgangbai 写道
zjc198805 写道
lz,假如android端有图片需要提交,服务器端该怎么实现呢?用rest风格的webservice

采用Servlet实现即可,我们采用Servlet实现。

发送字节流不就可以吗
2 楼 longgangbai 2012-04-28  
zjc198805 写道
lz,假如android端有图片需要提交,服务器端该怎么实现呢?用rest风格的webservice

采用Servlet实现即可,我们采用Servlet实现。
1 楼 zjc198805 2012-04-26  
lz,假如android端有图片需要提交,服务器端该怎么实现呢?用rest风格的webservice

相关推荐

    Android开发之WebService介绍

    在Android开发中,与远程服务器进行数据交互是常见的需求,而WebService就是实现这种交互的一种方式。WebService是一种基于网络的、分布式的模块化组件,旨在促进不同系统之间的互操作性。它允许不同的应用程序通过...

    Android成功调用REST WebService

    在Android开发中,调用REST WebService是一种常见的数据交互方式,尤其在移动应用与服务器端进行数据交换时。REST(Representational State Transfer)是一种网络应用程序的设计风格和开发方式,基于HTTP协议,允许...

    ANDROID中使用WEBSERVICE验证用户登录的示例

    在Android开发中,为了实现应用程序与服务器之间的数据交互,经常使用WebService技术进行用户验证,例如登录功能。这里的示例将详细介绍如何在Android应用中通过WebService接口验证用户登录信息。主要涉及的技术点...

    java android 调用webservice

    在Android开发中,Java语言是主要的编程工具,而Webservice是一种通过网络提供服务的方式,通常基于HTTP协议,使得移动应用、Web应用等可以互相交换数据。本篇将详细讲解如何在Android应用中使用Java调用Webservice...

    android调用webservice接口实现登陆源码

    在Android开发中,调用Web Service接口是常见的数据交互方式,尤其在实现用户登录功能时。Web Service通常采用SOAP或RESTful API的形式提供服务,允许客户端应用程序(如Android应用)发送请求并接收响应。本教程将...

    Android之Webservice详解与调用天气预报Webservice完整实例

    在Android开发中,Webservice是一种常见的数据交互方式,它允许移动应用通过网络获取远程服务器上的数据。本实例将深入探讨Android中如何使用Webservice,特别是针对天气预报服务的调用。我们将关注以下几个核心知识...

    WebService+Android

    【WebService+Android】是将Web服务技术应用到Android平台上的一个重要实践,主要目的是为了实现远程数据交换和交互。Web服务,通常基于SOAP(Simple Object Access Protocol)或REST(Representational State ...

    android webService

    在Android开发中,Web服务(通常指WebService)是一种允许应用程序之间进行交互的技术,它使得移动应用,如Android应用,能够与远程服务器进行数据交换。在本案例中,开发者遇到了一个常见的问题:`java.lang....

    android调用webservice获取手机归属地

    在Android开发中,有时我们需要获取用户的手机归属地信息,例如用于提供本地化的服务或进行数据分析。这通常通过调用Web Service来实现,因为这些服务通常提供了API接口供开发者使用。本教程将详细介绍如何在Android...

    android c# webservice 实现

    在IT行业中,Android和C#是两种非常重要的编程语言,分别用于移动应用开发和服务器端或桌面应用开发。Web服务,尤其是WebService,是两者之间进行数据交换的一种常见方式。本篇将详细介绍如何在Android和C#之间通过...

    android 访问webService Demo

    在Android开发中,访问Web Service是一项常见的任务,用于与服务器端进行数据交互。Web Service通常是一种基于HTTP协议的API,可以提供XML、JSON等格式的数据。在这个“android 访问webService Demo”中,我们将探讨...

    android调用webservice实现手机归属查询

    在Android开发中,调用Web Service来实现手机归属地查询是一项常见的需求,这通常涉及到网络通信、XML或JSON解析以及Web服务接口的调用。在这个过程中,开发者需要掌握以下关键知识点: 1. **Web Service**: Web ...

    android基于webservice云端运用最新代码EasyEnglish

    1. **Webservice基础**:Webservice是一种通过网络提供服务的方式,通常基于SOAP(Simple Object Access Protocol)或REST(Representational State Transfer)架构。SOAP是基于XML的,主要用于传递结构化信息,而...

    android访问webServicer

    在Android平台上,访问Web服务是实现应用程序与远程服务器交互的重要方式。本知识点主要涉及如何使用Android来调用WebService,特别是通过XML数据交换信息,并利用线程管理来优化性能。我们将详细探讨以下几个方面:...

    android webservice案例

    在Android开发中,Web Service是一种常见的数据交互方式,它允许移动应用与远程服务器进行通信,获取或发送数据。本案例“android webservice案例”聚焦于Android客户端如何调用Web Service来实现这一功能。我们将...

    android 访问c# webservice 实现登陆注册功能(android 上传json到服务器)

    在Android开发中,有时我们需要与后端服务进行交互,实现数据的交换,比如登录、注册等基本功能。这里我们讨论的是如何使用Android客户端通过C#编写的WebService接口,实现JSON数据的上传,以完成用户登录和注册操作...

    Android_webservice_json

    在Android开发中,调用Web服务来获取JSON对象是一个常见的需求。这涉及到网络通信和数据解析,是构建功能丰富的移动应用的重要组成部分。本教程将详细讲解如何在Android中使用Web服务,尤其是通过HTTP请求获取JSON...

    android-webservice参考代码

    在Android开发中,Web服务(Web Service)是应用程序与服务器端数据交互的一种重要方式,它允许客户端(如Android应用)通过网络发送请求并接收响应数据。本参考代码着重讲解如何在Android平台上集成和使用Web服务,...

Global site tag (gtag.js) - Google Analytics