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

用grails来实现网站API的一个思路

阅读更多
    众所周知,目前很多网站都提供了API的服务,其中也包括JavaEye。调用网站的API可以提供接口给其他系统使用,方便开发者实现mashup。
    
    一般的API可以是web service,也可以是返回xml、json,其实web service也是返回xml。我们使用grails可以非常容易实现返回xml,而无需借助任何插件。当然在grails中使用web service也相当容易。
   
    下面是一个API的controller:
import grails.converters.*

class ApiController {
    def login = {
        def userName = params.userName
        def password = params.password
        def user = User.findWhere(userName:userName,password:password)
        if (user)
           render user as XML
        else
           render(text:"<xml><user>not found user</user></xml>",contentType:"text/xml",encoding:"UTF-8")
    }

}

   
这样访问http://localhost:8080/工程名称/api/login?userName=test&password=test

如果存在用户名为test 密码为test的用户,则返回类似如下的xml:
  <?xml version="1.0" encoding="UTF-8" ?> 
  <user id="2">
  <userName>test</userName> 
  <password>test</password> 
  </user>


如果不存在该用户 也会返回一段xml。

如果需要添加其他的方法供外界调用,只需增加一个action,将其render as xml

需要注意的一点是:如果使用了grails的filter,必须修改相应的filter,比如我的代码如下:
class LoginFilters {
    def filters = {
        loginCheck(controller:'*', action:'*'){
            before = {
                if (params.controller == "api") {
                    return true
                }
                if(!session.user) {
                    if( !actionName.equals('login') && !actionName.equals('doLogin') ) {
                        redirect(controller:'user',action:'login')
                        return false
                    }
                }
            }
        }
    }
}

这样,如果访问apicontroller,就可以返回xml,否则的话只能返回登陆页面

其他的client端或者别的,只需解析xml就能得到相应的数据。

比如:使用andorid做一个系统的客户端,该系统采用grails实现,首先第一步就需要登陆系统。登陆的话就要验证用户名和密码。

登陆的代码如下:
import org.apache.http.client.HttpClient;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.HttpProtocolParams;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;

import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

/**
 * @author Tony Shen
 *
 */
public class LoginActivity extends Activity {
	
	Button cancleButton; //取消按钮
	Button loginButton;  //登陆按钮
	String responseBody = null;
	String result = null;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.login);
        validate();
    }
    
    private void validate() {
    	cancleButton = (Button) findViewById(R.id.cancel);
    	cancleButton.setOnClickListener(cancleListener);
		
    	loginButton = (Button) findViewById(R.id.login);
		loginButton.setOnClickListener(loginListener);
    }
    
    // cancle按钮监听器
    OnClickListener cancleListener = new OnClickListener() {
		public void onClick(View v) {
			Intent intent0 = new Intent(LoginActivity.this, LoginActivity.class);
			startActivity(intent0);
		}
	};
	
	// login按钮监听器
	OnClickListener loginListener = new OnClickListener() {
		public void onClick(View v) {
			CharSequence userNameValue = ((EditText) findViewById(R.id.username)).getText();
			CharSequence passwordValue = ((EditText) findViewById(R.id.password)).getText();
			
	        String url = "/TheSales/api/login";   
	        String host = "192.168.1.2:8080";
	        String params = "userName="+userNameValue.toString()+"&password="+passwordValue.toString();
	        HttpClient httpclient = new DefaultHttpClient();
	        httpclient.getParams().setParameter(HttpProtocolParams.HTTP_CONTENT_CHARSET,"UTF-8");

	        HttpGet httpget = new HttpGet("http://"+host+url+"?"+params);
	        ResponseHandler<String> responseHandler = new BasicResponseHandler();
	        try {
	        	responseBody = httpclient.execute(httpget, responseHandler);
		        Document document = DocumentHelper.parseText(responseBody);
		        Element root = document.getRootElement();
		        if("not found user".equals(root.elementText("user")))
		        {
		        	showDialog(1);
		        } else {
					Intent intent1 = new Intent(LoginActivity.this,c.class);
					startActivity(intent1);
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	};
	
	protected Dialog onCreateDialog(int id) {
		return buildDialog(LoginActivity.this);
	}
	
	private Dialog buildDialog(Context context) {
		Dialog dialog = new Dialog(context);
		dialog.setTitle("用户名或密码出错,请重新输入!");
		return  dialog;
	}
}

LoginActivity主要是通过HttpClient模拟请求系统,调用网站的api,返回xml。然后解析xml验证是否存在该用户。

MainActivity的代码很简单,主要使用main.xml,如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:orientation="vertical" android:layout_width="fill_parent"
	android:layout_height="fill_parent">
	<TextView android:id="@+id/android:empty"
		android:layout_width="wrap_content"
		android:layout_height="wrap_content" android:text="登陆成功!" />
</LinearLayout>


这样我们就可以登陆系统了,界面很简单,只不过是通过这个思路实现网站的API

  • 大小: 11.2 KB
分享到:
评论

相关推荐

    grails中文API

    grails 中文 API grails 中文 API

    grails_API_文档

    grails_API_文档,CHM格式 ,内容详细.

    Grails入门精通及中文API

    Grails入门到精通,Java平台快速web开发之选。

    grails实现分页技术

    供初学者使用,在grails中只有list(自动生成)中有分页实现,而自己新增的页面中需自己实现分页,该文档中描述了如何实现分页以及注意点

    Grails Grails Grails

    Grails Grails Grails Grails Grails

    使用 Grails 快速开发 Web 应用程序

    Grails入门好资料

    grails框架

    实际上,一个grails插件和一个grails应用基本是完全一样的,同样可以使用grails run-app命令来运行。区别仅在于一个插件的根目录下需要提供一个fooplugin.groovy文件,提供插件的一些描述信息。

    Groovy轻松入门——Grails实战基础篇

    在学习任何东西之前,最重要的是培养兴趣,Groovy世界最耀眼的技术之一--Grails相信大家早已耳闻,我将通过Grails实战系列文章 向您展现Grails的迷人风采,使您感受到Grails的魅力,以至疯狂地爱上Grails,并坠入...

    Grails权威指南 Grails权威指南

    Grails权威指南Grails权威指南Grails权威指南Grails权威指南Grails权威指南Grails权威指南

    Eclipse下搭建Grails项目

    Grails项目的应用越来越多,而对于初学者来说,在Eclipse下搭建Grails项目是一个难题,这个文档将教会你如何搭建Grails项目,希望对你有所帮助。

    Grails 教程

    Grails是一个full-stack框架,它借助于核心技术与相关的插件(plug-in)来解决Web开发中方方面面的问题,其中包括: 易于使用的基于Hibernate的对象-关系映射(ORM)层 称为Groovy Server Pages (GSP)的表现层技术 ...

    Grails-开源框架---使用指南(中文)

    Grails是一套用于快速Web应用开发的开源框架,它基于Groovy编程语言,并构建于Spring、Hibernate等开源框架之上,是一个高生产力一站式框架。 Grails这个独特的框架被视为是提升工程师生产效率的动态工具,因为其...

    Grails1.1中文文档

    一个内嵌的 Jetty 容器被配置用来快速重载应用 Spring 容器内建的依赖注入技术 基于 Spring 的 MessageSource 核心概念的国际化 (i18n) 支持 基于 Spring 的抽象事务概念的事务服务层 所有这些都非常易于使用,...

    Grails 和 jQuery开发实例

    使用 Grails 和 jQuery 快速开发一个 Web Calendar 程序。

    grails-3.3.9

    Grails是一套用于快速Web应用开发的开源框架,它基于Groovy编程语言,并构建于Spring、Hibernate等开源框架之上,是一个高生产力一站式框架。 Grails这个独特的框架被视为是提升工程师生产效率的动态工具,因为其...

    使用Grails快速开发Web应用

    Grails开发Web应用的入门建立兴趣的最佳教程。

    第一个grails程序

    自己动手一步步写出来的简单登录验证程序,代码比较简单,可以随便看看。

    grails-开源框架使用指南

    Grails是一个full-stack框架,它借助于核心技术与相关的插件(plug-in)来解决Web开发中方方面面的问题,其中包括: 易于使用的基于Hibernate的对象-关系映射(ORM)层 称为Groovy Server Pages (GSP)的表现层技术 ...

    grails使用freemarker.rar

    freemarker是一个比较好用的java模板引擎,grails也对它有很好的支持,该资源大有用处。

Global site tag (gtag.js) - Google Analytics