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

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;
}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值