`
wooce
  • 浏览: 184251 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

基于Restlet的SNS的Open API平台前台代码的示例

    博客分类:
  • Java
阅读更多
    REST API的users.getInfo,user.isAppAdded等method, 如何在开放平台的服务器端dispatch到对应的class或module来进行处理? 以下是一利用java的反射机制的简单示例代码,仅作抛砖引玉。
package com.xxx.api.web.restlet;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Map;
import java.util.StringTokenizer;

import org.restlet.data.MediaType;
import org.restlet.data.Response;
import org.restlet.data.Status;
import org.restlet.resource.Resource;

/**
*
* @author Yang Hongfen
*/
public class APIResoure extends Resource {
	private MemberInfoService memberInfoService;
	private PlugAppService plugAppService;
	private TokenDataStoreAccess tokenAccess;
	@SuppressWarnings("unused")
	private com.xxx.api.service.users.Service usersService;
	@SuppressWarnings("unused")
	private com.xxx.api.service.friends.Service friendsService;

	@Override
	public boolean allowPost() {
		return true;
	}

	/**
	 * Handle POST requests: 
	 */
	@Override
	public void handlePost() {
		Map<String, Object> attributes = getRequest().getAttributes();
		String methodStr = (String) attributes.get("method");
		String api_key = (String) attributes.get("api_key");
		String auth_token = (String) attributes.get("auth_token");
		String api_sig = (String) attributes.get("api_sig");
		String call_id_str = (String) attributes.get("call_id");
		attributes.remove("api_sig");

		if (methodStr == null || methodStr.length() == 0 || api_sig == null
				|| api_sig.length() == 0 || call_id_str == null
				|| call_id_str.length() == 0) {
			ErrorUtil.generateErrorRepresentation(
					Status.CLIENT_ERROR_BAD_REQUEST,
					ErrorCode.PARAMETER_MISSING_OR_INVALID, getResponse());
			return;
		}
		
		Float call_id = Float.valueOf(call_id_str);
		// 根据API_KEY获取相应的APP应用
		PlugApp plugApp = plugAppService.getByAPIKey(api_key);
		if (plugApp == null) {
			ErrorUtil.generateErrorRepresentation(Status.SUCCESS_OK,
					ErrorCode.INVALID_API_KEY, getResponse());
			return;
		}
		if (plugApp.getAudit()!=1 || plugApp.getIsPublished()!=1 || plugApp.getIsClosed()!=0){
			ErrorUtil.generateErrorRepresentation(Status.SUCCESS_OK,
					ErrorCode.SERVICE_UNAVAILABLE, getResponse());
			return;
		}
		String secret = plugApp.getSecret();
		if (!api_sig.equals(APIUtils.calculateSignature(attributes, secret))) {
			ErrorUtil.generateErrorRepresentation(Status.SUCCESS_OK,
					ErrorCode.INCORRECT_SIGNATURE, getResponse());
			return;
		}

		if (methodStr.equals("auth.createToken")) {
			String ticket = (String) attributes.get("ticket");
			String uid = (String) attributes.get("uid");
			Integer memberId = Integer.parseInt(uid);
			MemberVo vo = null;
			try {
				vo = memberInfoService.findMemberInfoById(memberId);
			} catch (Exception e) {
				ErrorUtil.generateErrorRepresentation(Status.SUCCESS_OK,
						ErrorCode.SERVICE_UNAVAILABLE, getResponse());
				return;
			}
			if (vo == null) {
				ErrorUtil.generateErrorRepresentation(Status.SUCCESS_OK,
						ErrorCode.INVALID_USER_ID, getResponse());
				return;
			}
			if( !plugAppService.isAppUser(plugApp.getId(), memberId)){
				//todo
			}
			// todo: 判断ticket和memberId的登录合法性:

			ResultInfo<KeyEntry> token = tokenAccess.generateToken(plugApp,
					ticket, memberId);
            RepresentationUtil.createTokenResult(token.getEntity().getAuth_token(), vo, getResponse());
			return;
		}
		// 其他的需要验证token的method的处理:
		ResultInfo<KeyEntry> entry = tokenAccess.getEntry(auth_token,call_id);
		if (entry.getCode() != 0) {
			ErrorUtil.generateErrorRepresentation(Status.SUCCESS_OK,
					entry.getMessage(), getResponse());
			return;
		}
		// Dispatch and Process:
		attributes.put("curr_uid", entry.getEntity().getMemberId());
		attributes.put("app_id", entry.getEntity().getApp_id());
		StringTokenizer st = new StringTokenizer(methodStr, ".");
		String packageName = st.nextToken();
		String methodName = st.nextToken();

		try {
			Object serviceObj = this.getClass().getField(packageName + "Service").get(
					this);
			Method method = serviceObj.getClass().getMethod(methodName);
			method.invoke(serviceObj, attributes);
		} catch (NoSuchFieldException e) {
			ErrorUtil.generateErrorRepresentation(Status.SUCCESS_OK,
					ErrorCode.METHOD_NOT_FOUND, getResponse());
			return;
		} catch (IllegalArgumentException e) {
			ErrorUtil.generateErrorRepresentation(Status.SUCCESS_OK,
					ErrorCode.UNKNOWN_ERROR, getResponse());
		} catch (SecurityException e) {
			ErrorUtil.generateErrorRepresentation(Status.SUCCESS_OK,
					ErrorCode.UNKNOWN_ERROR, getResponse());
		} catch (IllegalAccessException e) {
			ErrorUtil.generateErrorRepresentation(Status.SUCCESS_OK,
					ErrorCode.UNKNOWN_ERROR, getResponse());
		} catch (NoSuchMethodException e) {
			ErrorUtil.generateErrorRepresentation(Status.SUCCESS_OK,
					ErrorCode.METHOD_NOT_FOUND, getResponse());
			return;
		} catch (InvocationTargetException e) {
			ErrorUtil.generateErrorRepresentation(Status.SUCCESS_OK,
					ErrorCode.UNKNOWN_ERROR, getResponse());
		}
		return;
	}
}


TokenDataStoreAccess.java:
/**
 *
 * @author Yang Hongfen
 */
public interface TokenDataStoreAccess {
	ResultInfo<KeyEntry> getEntry(String token,Float call_id);
	ResultInfo<KeyEntry> generateToken(PlugApp plugApp,String ticket,Integer member_id);
}


TokenDataStoreAccessImpl.java
package com.xxx.api.auth;

import java.util.Date;
import java.util.UUID;

import com.xxx.api.constants.ErrorCode;
import com.xxx.cache.CacheClient;
import com.xxx.domain.my.PlugApp;
import com.xxx.service.my.PlugAppService;
import com.xxx.util.ResultInfo;

/**
 *
 * @author Yang Hongfen
 */
public class TokenDataStoreAccessImpl implements TokenDataStoreAccess{
    private CacheClient cacheClient;
    
	public ResultInfo<KeyEntry> getEntry(String token,Float call_id){
		ResultInfo<KeyEntry> ri = new ResultInfo<KeyEntry>(); 
		if( cacheClient.keyExists(token) ){
			KeyEntry entry = (KeyEntry)cacheClient.get(token);
			if( entry.isTimeOut() ){
				cacheClient.delete(token);
				ri.setCode(-1);
				ri.setMessage(ErrorCode.INVALID_AUTH_TOKEN);
				return ri;
			}
	        if(call_id<=entry.getCall_id()){
				ri.setCode(-1);
				ri.setMessage(ErrorCode.INVALID_CALL_ID);
				return ri;
	        }
	        entry.call_id = call_id;
			entry.accessTime = new Date();
			cacheClient.addOrReplace(token, entry);
			ri.setCode(0);
			ri.setEntity(entry);
			return ri;
		}
		else{
			ri.setCode(-1);
			ri.setMessage(ErrorCode.INVALID_AUTH_TOKEN);
			return ri;
		}
    }

	public ResultInfo<KeyEntry> generateToken(PlugApp plugApp,String ticket,Integer member_id){
        ResultInfo<KeyEntry> ri = new ResultInfo<KeyEntry>();
		KeyEntry entry = new KeyEntry();
		entry.api_key = plugApp.getApiKey();
		entry.ticket = ticket;
		entry.app_id = plugApp.getId();
		entry.callbackUrl = plugApp.getCallBackUrl();
		entry.memberId = member_id;
		entry.auth_token = UUID.randomUUID().toString();
		entry.accessTime = new Date();
		entry.call_id = new Float(0);
        cacheClient.add(entry.getAuth_token(), entry);
        ri.setCode(1);
        ri.setMessage("成功!");
        ri.setEntity(entry);
        return ri;
    }

}
1
1
分享到:
评论

相关推荐

    Restlet Client - REST API Testing

    Restlet Client - REST API Testing,用来发送请求,可用于测试后端代码,简单易用

    restlet处理各种请求方式参考示例

    REST(Representational State Transfer)是一种架构风格,强调简洁、无状态和基于标准的Web服务设计。本示例将详细阐述如何使用Restlet框架处理HTTP协议中的各种请求方法,如GET、POST、PUT、DELETE等。 首先,让...

    Web Api调试工具 Chrome插件Restlet-Client-REST-API-Testing

    Chrome插件Restlet Client - REST API Testing是一款非常实用的工具,专为Web API的调试和测试设计。这款插件支持多种HTTP方法(如GET、POST、PUT、DELETE等),并提供了丰富的功能,使得API测试过程更加高效和便捷...

    restlet2.1学习笔记项目代码

    在这个"restlet2.1学习笔记项目代码"中,你可以找到如何设置Restlet组件、创建资源、定义路由、使用过滤器以及与其他服务通信的实际示例。通过阅读和运行这些代码,你可以深入理解Restlet的工作原理,并将其应用到...

    Restlet Client - REST API Testing.crx

    Chrome插件 Visually create and run single HTTP requests as well as complex scenarios. Automate your API tests with our CI/CD plugin.

    restlet入门helloworld示例

    restlet入门helloworld示例

    restlet2.0版本jee源代码

    9. **测试和支持(Testing and Support)**: 除了源代码,Restlet 2.0还提供了示例和测试用例,帮助开发者更好地理解和学习如何使用框架。此外,社区支持和官方文档也提供了丰富的资源。 10. **版本2.0.14**: 这个...

    Restlet Client - REST API Testing(DHC)

    **REST API 测试工具——Restlet Client (DHC)** 在现代软件开发中,REST (Representational State Transfer) API已经成为构建分布式系统和服务交互的主要方式。它们提供了轻量级、无状态和基于HTTP协议的接口,...

    restlet入门示例

    本示例将带你入门Restlet,帮助你理解如何使用它来创建简单的Web服务。 首先,让我们了解REST的基本概念。REST架构基于HTTP协议,通过HTTP方法(GET、POST、PUT、DELETE等)来操作资源。资源通常由URI(Uniform ...

    restlet工程示例

    Restlet是一个开源框架,专门用于构建RESTful(Representational State Transfer)Web...在压缩包文件"restlet"中,应该包含了实现上述功能的代码示例,通过学习和分析这些示例,你可以更好地理解和运用Restlet框架。

    基于Spring的Restlet实例

    标题"基于Spring的Restlet实例"意味着我们将探讨如何在Spring环境中集成和使用Restlet库来开发REST服务。这通常涉及以下几个关键知识点: 1. **RESTful服务基础**:REST是一种软件架构风格,强调通过HTTP协议暴露...

    最新版本Restlet Client - REST API Testing

    适用最新版的chrome,DHC是一款可以帮助用户使用chrome插件模拟HTTP客户端发送测试数据到服务器的谷歌浏览器插件,在chrome中安装了DHC插件以后,就可在服务器端代码初步完成的时候,使用DHC进行数据测试,以便更早地...

    Restlet Client 插件安装包

    总之,`Restlet Client`是一款强大的REST API测试工具,它为开发者提供了便捷的API测试环境,是进行SpringBoot或其他基于REST架构项目开发时不可或缺的助手。通过熟练使用,可以极大地提升开发效率和质量。

    chromecj.com-Restlet-Client-REST-API-Testing_v2.8.0.1.zip

    总之,Restlet Client 是一个强大的 Chrome 插件,专为 REST API 开发和测试而设计,提供了一站式的解决方案,帮助开发者高效地完成 API 的调试和验证工作。随着版本的升级,它持续优化用户体验,增强功能,是现代 ...

    restlet

    文件列表中的"RESTlet"可能是RESTlet框架的源代码、文档或示例应用。通过学习这些资料,开发者可以深入理解RESTlet的工作原理,掌握如何使用RESTlet构建RESTful服务和客户端应用,从而提升其在Web服务开发领域的专业...

    chromecj.com-Restlet-Client-REST-API-Testing_v2.8.0.1.rar

    Restlet Client是一款强大的REST API测试工具,它是针对谷歌浏览器(Chrome)和其他基于Chromium内核的浏览器设计的扩展程序,如360浏览器和360极速浏览器。这个工具简化了API开发和调试过程,无需依赖Postman这样的...

    restlet restful

    总的来说,"restlet restful"项目是一个基于RESTlet框架的RESTful Web服务实现,提供了便捷的客户端和服务端通信方式,便于开发和测试。通过"RestApplication"类,我们可以创建和管理REST资源,实现对HTTP请求的处理...

Global site tag (gtag.js) - Google Analytics