项目一直有用到thrift这东西,thrift的介绍网上也挺多的。
描述:thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发。它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, and OCaml 这些编程语言间无缝结合的、高效的服务。
今天写了个servlet服务器端的http请求与as3客户端请求的列子。这里做个笔记哈。
test.thrift
-
namespace java com.xzw.thrift
-
namespace as3 com.xzw.thrift
-
struct User{
-
1:i32 userId,
-
2:string loginName,
-
3:string password,
-
4:string name
-
}
-
exception UserNotFound{
-
1:string msg //as3中由于message是关键字,所以避免使用message关键字。
-
}
-
service UserService{
-
User getUser(1:string loginName) throws (1:UserNotFound unf),
-
list<User> getUsers()
-
}
通过命令生成java代码
>thrift --gen java test.thrift
以上命令会生成gen-java的目录拷贝里面的代码到你的项目中。如图com.xzw.thrift就是
工具生成java类。
其中我们需要去实现UserService类中的IFace接口。代码如下:
-
/*
-
* To change this template, choose Tools | Templates
-
* and open the template in the editor.
-
*/
-
package com.xzw.service;
-
import com.xzw.thrift.User;
-
import com.xzw.thrift.UserNotFound;
-
import com.xzw.thrift.UserService;
-
import java.util.ArrayList;
-
import java.util.List;
-
import java.util.logging.Logger;
-
import org.apache.thrift.TException;
-
/**
-
*
-
* @author xzw
-
*/
-
publicclass UserServiceHandler implements UserService.Iface{
-
public User getUser(String loginName) throws UserNotFound, TException {
-
if(!"xuzhiwei".equals(loginName)){
-
UserNotFound e = new UserNotFound("用户无法找到!");
-
throw e;
-
}
-
User user = new User();
-
user.setUserId(100);
-
user.setLoginName("xuzhiwei");
-
user.setPassword("123456");
-
user.setName("user1");
-
Logger.getLogger("user=>"+user.toString());
-
return user;
-
}
-
public List<User> getUsers() throws TException {
-
List<User> list = new ArrayList<User>();
-
User user = new User();
-
user.setUserId(100);
-
user.setLoginName("xuzhiwei");
-
user.setPassword("123456");
-
user.setName("user1");
-
list.add(user);
-
User user2 = new User();
-
user2.setUserId(200);
-
user2.setLoginName("login2");
-
user2.setPassword("pwd2");
-
user2.setName("user2");
-
list.add(user2);
-
Logger.getLogger("user list=>"+list.toString());
-
return list;
-
}
-
}
编写servlet,servlet需要继承thrift提供的类包TServlet即可,不需要去重写doGet,doPost方法。
-
/*
-
* To change this template, choose Tools | Templates
-
* and open the template in the editor.
-
*/
-
package com.xzw.service;
-
import com.xzw.thrift.UserService;
-
import org.apache.thrift.protocol.TBinaryProtocol;
-
import org.apache.thrift.server.TServlet;
-
/**
-
*
-
* @author xzw
-
*/
-
publicclass UserServlet extends TServlet{
-
public UserServlet(){
-
super(new UserService.Processor(new UserServiceHandler()),new TBinaryProtocol.Factory(true, true));
-
}
-
}
以上就完成服务器端的编写了。
可以使用junit测试一下:
-
/*
-
* To change this template, choose Tools | Templates
-
* and open the template in the editor.
-
*/
-
import com.xzw.thrift.User;
-
import com.xzw.thrift.UserService;
-
import java.util.List;
-
import java.util.logging.Level;
-
import java.util.logging.Logger;
-
import org.apache.thrift.TException;
-
import org.apache.thrift.protocol.TBinaryProtocol;
-
import org.apache.thrift.protocol.TProtocol;
-
import org.apache.thrift.transport.THttpClient;
-
import org.junit.*;
-
/**
-
*
-
* @author xzw
-
*/
-
publicclass TestServlet {
-
@Test
-
publicvoid test(){
-
String serveltUrl = "http://localhost:8080/test_thrift/userServlet";
-
try {
-
THttpClient thc = new THttpClient(serveltUrl);
-
TProtocol lopFactory = new TBinaryProtocol(thc);
-
UserService.Client client = new UserService.Client(lopFactory);
-
List users = client.getUsers();
-
System.out.println("-->>"+users.toString());
-
} catch (TException ex) {
-
Logger.getLogger(TestServlet.class.getName()).log(Level.SEVERE, null, ex);
-
}
-
}
-
@Test
-
publicvoid test2(){
-
String serveltUrl = "http://localhost:8080/test_thrift/userServlet";
-
try {
-
THttpClient thc = new THttpClient(serveltUrl);
-
TProtocol lopFactory = new TBinaryProtocol(thc);
-
UserService.Client client = new UserService.Client(lopFactory);
-
User user = client.getUser("xuzhiwei");
-
System.out.println("-->"+user.toString());
-
} catch (TException ex) {
-
Logger.getLogger(TestServlet.class.getName()).log(Level.SEVERE, null, ex);
-
}
-
}
-
}
接下来生成as3代码
>thrift --gen as3 test.thrift
以上代码会生成gen-as3的目录,拷贝目录下的代码到你的工程中。
编写as3客户端类:
-
package
-
{
-
import com.xzw.thrift.User;
-
import com.xzw.thrift.UserNotFound;
-
import com.xzw.thrift.UserService;
-
import com.xzw.thrift.UserServiceImpl;
-
import flash.display.Sprite;
-
import flash.net.URLRequest;
-
import flash.text.TextField;
-
import org.apache.thrift.protocol.TBinaryProtocol;
-
import org.apache.thrift.protocol.TProtocol;
-
import org.apache.thrift.transport.THttpClient;
-
public class testthrift extends Sprite
-
{
-
private const SERVER_URL:String = "http://localhost:8080/test_thrift/userServlet";
-
private var textField:TextField;
-
publicfunction testthrift()
-
{
-
init();
-
connServer();
-
}
-
private function init():void
-
{
-
textField = new TextField();
-
textField.width = 300;
-
textField.height = 500;
-
textField.autoSize = "left";
-
addChild(textField);
-
}
-
private function connServer():void
-
{ //实例化URLRequest
-
var urlRequest:URLRequest = new URLRequest(SERVER_URL);
-
//实例化THttpClient
-
var thc:THttpClient = new THttpClient(urlRequest);
-
var protocol:TProtocol = new TBinaryProtocol(thc);
-
var usImpl:UserService = new UserServiceImpl(protocol);
-
usImpl.getUser("xuzhiwei",onError,onUserSuccess);
-
//usImpl.getUsers(onError,onSuccess);
-
}
-
private function onError(e:UserNotFound):void{
-
trace(e);
-
}
-
private function onUserSuccess(user:User):void{
-
trace("success:");
-
trace(user);
-
textField.text = user.toString();
-
}
-
private function onSuccess(user:Array):void{
-
trace(user);
-
textField.text = user.toString();
-
}
-
}
-
}
thrift目前越来越多人在使用它,但是as3的一直找不到比较完整的例子。今天写了与大家分享哈。
欢迎拍砖。
本文转自xuzw13 51CTO博客,原文链接:http://blog.51cto.com/xuzhiwei/1184540,如需转载请自行联系原作者