您的位置:首页 > Web前端 > JavaScript

Thrift生成Java端和JavaScript端代码,并实现前端调用后端的方法

2018-03-08 20:26 656 查看

Thrift生成Java端和JavaScript端代码,并在前端调用后端的方法,服务通过Vertx提供

1.什么是Thrift

下面这篇文章介绍的很详细,可以点进去了解一下什么是Thrift

http://blog.csdn.net/qq_27784479/article/details/73250958

2.如何生成java端和js端代码

windows下比较简单,官方提供了预编译的exe文件。地址在下面:

https://thrift.apache.org/docs/install/windows

编写好.thrift文件,语法在上面的链接里可以学习一下,直接上代码;

namespace java test.thrift

struct FieldInfo{
1:string fieldName
2:FieldType fieldType
3:string aliesName
4:string desc
5:i32 order
}
enum FieldType{
LONGLAT = 1,
TEXT = 2,
TIME = 3
}
enum DbType{
ORACLE = 1,
POSTGRESQL =2
}
struct ReturnResult {
1:bool status
2:string id
3:string message
}
service DbSourceTableMgr{
ReturnResult addDbSourceTable(1:DbType dbtype,2:string address,3:i32 port,4:string user,5:string pwd,6:string desc,7:string tablename,8:bool ismulti,9:string multirule,10:FieldInfo fieldInfo),
ReturnResult deleteDbSourceTable(1:string id)
}


将Thrift文件和下载的thrift.exe放在一个文件夹下面,执行以下命令:

thrift-0.10.0.exe -r --gen js --gen java test.thrift


即可生成gen-java文件夹和gen-js文件夹,里面分别包含了服务端的java代码和前端的js代码。

生成的java端代码包括:

DbSourceTableMgr.java
DbType.java
FieldInfo.java
FiledType.java
ReturnResult.java


生成的js端代码包括:

DbSourceTableMgr.js
DbSourceTableMgr_types.js


对于test.thrift中的service DbSourceTableMgr会生成DbSourceTableMgr类,该类中有一个Iface接口,新建一个DbSourceTableMgr的实现类DbSourceTableMgrImp,继承DbSourceTableMgr.Iface,代码如下:

package com.link2map.thrift.imp;

import org.apache.thrift.TException;

import com.link2map.thrift.DbType;
import com.link2map.thrift.DbSourceTableMgr;
import com.link2map.thrift.FieldInfo;
import com.link2map.thrift.ReturnResult;

public class DbSourceTableMgrImp implements DbSourceTableMgr.Iface{

@Override
public ReturnResult addDbSourceTable(DbType dbtype, String address, int port, String user, String pwd, String desc,
String tablename, boolean ismulti, String multirule, FieldInfo fieldInfo) throws TException {
System.out.println(dbtype);
System.out.println(address);
System.out.println(fieldInfo.getAliesName()+"|"+fieldInfo.getFieldType());
return new ReturnResult(true,"2222","sucess");
}

@Override
public ReturnResult deleteDbSourceTable(String id) throws TException {
System.out.println("id"+id);
return new ReturnResult(true,"1111","dddd");
}

}


下面创建vertx服务:

package service;

import org.apache.thrift.TProcessor;
import org.apache.thrift.protocol.TJSONProtocol;
import org.apache.thrift.protocol.TProtocol;
import org.apache.thrift.transport.TMemoryBuffer;

import com.link2map.thrift.DbSourceTableMgr;
import com.link2map.thrift.imp.DbSourceTableMgrImp;

import io.vertx.core.AbstractVerticle;
import io.vertx.core.Vertx;
import io.vertx.core.http.HttpMethod;
import io.vertx.ext.web.Router;
import io.vertx.ext.web.handler.CorsHandler;

public class VertxService extends AbstractVerticle{
public static void main(String[] args) {
Vertx vertx=Vertx.vertx();
Router router = Router.router(vertx);
// 解决跨域问题
router.route().handler(
CorsHandler.create("*").allowedMethod(HttpMethod.GET)
.allowedMethod(HttpMethod.POST)
.allowedMethod(HttpMethod.OPTIONS)
.allowedHeader("X-PINGARUNER")
.allowedHeader("Content-Type"));
router.route("/server/*").handler(context->{
context.request().handler(buffer->{
byte[] arr=buffer.getBytes();
vertx.executeBlocking(future->{
String result=thriftRequest(arr);
future.complete(result);
}, res->{
if(res.succeeded()) {
context.response().end(res.result().toString());
}else {
context.response().end(res.cause().getMessage());
}
});
});
});
vertx.createHttpServer().requestHandler(router::accept).listen(8088, res->{
if(res.succeeded()) {
System.out.println("Server starts successfully!");
}else {
System.out.println("Server fails to start!");
}
});
vertx.deployVerticle(new VertxService());
}
private static String thriftRequest(byte[] input){
try{

//Input
TMemoryBuffer inbuffer = new TMemoryBuffer(input.length);
System.out.println("input-length:"+input.length);
inbuffer.write(input);
TProtocol  inprotocol   = new TJSONProtocol(inbuffer);

//Output
TMemoryBuffer outbuffer = new TMemoryBuffer(100);
TProtocol outprotocol   = new TJSONProtocol(outbuffer);
//这里是关键的地方,thrift提供了一个通用的service接口TProcessor,前端发送请求后,实际通过DbSourceTableMgrImp的方法进行处理
TProcessor processor = new DbSourceTableMgr.Processor(new DbSourceTableMgrImp());
processor.process(inprotocol, outprotocol);
byte[] output = new byte[outbuffer.length()];
outbuffer.readAll(output, 0, output.length);
return new String(output,"UTF-8");
}catch(Throwable t){
return "Error:"+t.getMessage();
}

}
}


至此,服务端代码已经完成;

下面对js端代码进行说明,需要用到Tomcat。

在Tomcat的webapps下新建一个项目,把gen-js中的两个js文件拷贝过来,还需要一个thrift.js,一共3个js文件,一个index.html文件,一个WEB-INF文件夹。WEB-INF中包含classes和libs两个文件夹。在index.html里引入3个js文件,调用如下代码:

var transport = new Thrift.Transport("http://127.0.0.1:8088/server/1");
var protocol  = new Thrift.Protocol(transport);
var client    = new DbSourceTableMgrClient(protocol);
var fieldInfo = new FieldInfo();
fieldInfo.aliesName = 'alies';
fieldInfo.fieldName = 'tel';
fieldInfo.desc = 'desc';
fieldInfo.order = 3;
fieldInfo.fieldType = FieldType.LONGLAT;
console.log(fieldInfo);
var result = client.add(DbType.ORACLE,'1234',30,'gyd','6055','no','che',true,'multi',fieldInfo);
alert(result.status);
alert(result.id);
alert(result.message);
var result2 = client.delTable('10000');
alert(result2.status);
alert(result2.id);
alert(result2.message);


至此,前端的工作完成,进行测试,前端可以成功调用后端的函数,序列化和数据处理等过程由thrift提供,我们可以着重于业务代码的编写。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐