我是Vert的新手。我正在尝试实现一个小型REST API,它将数据存储在本地文件系统的JSON文件中。
到目前为止,我设法实现了REST API,因为Vertx在这方面有很好的文档记录。
我目前正在寻找的是如何在Vert. x中构建数据访问对象的示例。我怎样才能实现一个可以对包含JSON的文本文件执行粗鲁操作的版本?
你能给我举些例子吗?有什么提示吗?
更新1:
通过对文件进行CRUD操作,我想到了以下内容。想象一下,在路径/api/v1/user/: userid/记录/
上有一个名为Records
的REST资源。
在启动HTTP服务器的垂直通道中,我有以下路径。
router.get('/api/user/:userid/records').handler(this.&handleGetRecords)
router.post('/api/user/:userid/records').handler(this.&handleNewRecord)
处理程序方法handleGetRecords
和handleNewRecord
使用Vertx事件总线发送消息。
request.bodyHandler({ b ->
def userid = request.getParam('userid')
logger.info "Reading record for user {}", userid
vertx.eventBus().send(GET_TIME_ENTRIES.name(), "read time records", [headers: [userId: userid]], { reply ->
// This handler will be called for every request
def response = routingContext.response()
if (reply.succeeded()) {
response.putHeader("content-type", "text/json")
// Write to the response and end it
response.end(reply.result().body())
} else {
logger.warn("Reply failed {}", reply.failed())
response.statusCode = 500
response.putHeader("content-type", "text/plain")
response.end('That did not work out well')
}
})
})
然后还有另一个顶点消耗这些消息GET_TIME_ENTRIES
或CREATE_TIME_ENTRY
。我认为这个消费者顶点是记录
的数据访问对象。这个顶点可以读取包含所有用户记录的给定: userid
的文件。顶点能够
这里是读取所有记录的例子。
vertx.eventBus().consumer(GET_TIME_ENTRIES.name(), { message ->
String userId = message.headers().get('userId')
String absPath = "${this.source}/${userId}.json" as String
vertx.fileSystem().readFile(absPath, { result ->
if (result.succeeded()) {
logger.info("About to read from user file {}", absPath)
def jsonObject = new JsonObject(result.result().toString())
message.reply(jsonObject.getJsonArray('records').toString())
} else {
logger.warn("User file {} does not exist", absPath)
message.fail(404, "user ${userId} does not exist")
}
})
})
我试图实现的是像上面那样读取文件,并将JSON反序列化为POJO(例如列表)
我想下面的链接会帮助你,这是Vertx crud操作的一个很好的例子。
使用hikari的Vertx学生积垢操作
首先,在我看来,您使用EventBus的方法很好。它可能会慢一点,因为EventBus将序列化/反序列化对象,但它提供了一个非常好的解耦。
您可以在这里看到另一种方法的示例:
https://github.com/aesteve/vertx-feeds/blob/master/src/main/java/io/vertx/examples/feeds/dao/RedisDAO.java
请注意每个方法如何接收处理程序作为其最后一个参数:
public void getMaxDate(String feedHash, Handler<Date> handler) {
耦合度更高,但效率也更高。
对于更经典、更直接的方法,您可以看到官方示例:
https://github.com/aokolnychyi/vertx-example/blob/master/src/main/java/com/aokolnychyi/vertx/example/dao/MongoDbTodoDaoImpl.java
您可以看到,这里的DAO基本上是同步的,但是由于处理程序仍然是异步的,所以它还是可以的。
如果已知主键的值,那么可以使用这些方法进行 CRUD 操作 对 object 操作的四个方法 Read / Insert / Update / Delete o := orm.NewOrm() user := new(User) user.Name = "slene" fmt.Println(o.Insert(user)) user.Name = "Your" fmt.Println(o.Up
代码从卡中刮取单个事件,但我一直收到以下错误: C:\Python27\python.exeC:/用户/詹姆斯/PycharmProjects/剪贴画/scrapy.py回溯(最近的调用最后):文件"C:/用户/詹姆斯/PycharmProjects/剪贴画/scrapy.py",第31行,在writer.writerow(c)值错误: I/O关闭文件的操作 我正在使用pyCharm。 退出代码为
我知道这应该很简单,但是我想从熊猫数据框中取一列,并且只对满足某些条件(比如小于1)的条目乘以标量(比如2)。 例如,在这个数据框中, 如果我有兴趣在列上执行此操作,结果应该是 我有以下绝对任务: 但是我不知道如何使用中的实际值。 提前谢谢!
我有一个猫鼬模式 我最初设置了名称和电话字段的集合。我需要将集合更新为消息数组中的新消息和新地址到地址对象中。该函数还必须处理任何单个操作,即在某些情况下我只更新到消息数组或更新到名称和地址。所以我如何在单个函数中执行所有操作。
从API 21(Lollipop)开始,应用程序可以获得修改真实SD卡的特殊权限,如我写的历史发文所示(这里和这里)。 我可以删除文件,也可以创建文件,但我找不到执行其他基本文件操作的方法: 读,写,使用InputStream和OutputStream 移动文件。 创建一个文件夹而不仅仅是一个文件 重命名文件 获取文件信息(最近更新等) 通过其他应用程序共享/打开文件。 其他行动我可能已经忘记了。