spring - 使用 Spring Boot API 执行流程时使用/返回 JSON 响应
问题描述
我是 Corda 的初学者,我正在尝试使用 Spring Boot API 执行流程。当我使用:
@PostMapping(value = [ "create-iou" ], 产生 = [ TEXT_PLAIN_VALUE ] , headers = [ "Content-Type=application/x-www-form-urlencoded" ])
我的流程正在执行(通过使用失眠测试它)。但是当我把它改成
@PostMapping(value = [ "create-iou" ], 产生 = [ APPLICATION_JSON_VALUE ], headers = [ "Content-Type=application/json" ])
它给了我一个 406 不可接受的错误:没有返回响应的正文。
这是我创建/复制的 API:
@PostMapping(value = [ "create-iou" ], produces = [ TEXT_PLAIN_VALUE ] , headers = [ "Content-Type=application/x-www-form-urlencoded" ])
fun createIOU(request: HttpServletRequest): ResponseEntity<String> {
val iouValue = request.getParameter("iouValue").toInt()
val partyName = request.getParameter("partyName")
?: return ResponseEntity.badRequest().body("Query parameter 'partyName' must not be null.\n")
if (iouValue <= 0 ) {
return ResponseEntity.badRequest().body("Query parameter 'iouValue' must be non-negative.\n")
}
val partyX500Name = CordaX500Name.parse(partyName)
val otherParty = proxy.wellKnownPartyFromX500Name(partyX500Name) ?: return ResponseEntity.badRequest().body("Party named $partyName cannot be found.\n")
return try {
val signedTx = proxy.startTrackedFlow(::Initiator, iouValue, otherParty).returnValue.getOrThrow()
ResponseEntity.status(HttpStatus.CREATED).body("Transaction id ${signedTx.id} committed to ledger.\n")
} catch (ex: Throwable) {
logger.error(ex.message, ex)
ResponseEntity.badRequest().body(ex.message!!)
}
}
我想返回这样的东西:
{
iouValue: 99,
lender: PartyA,
borrower: PartyB
}
使用 http 端点执行流程时。
解决方案
您需要使用 Corda 提供的 RPC 连接库:
import net.corda.client.rpc.CordaRPCClient
import net.corda.client.rpc.CordaRPCConnection
看看这个例子,看看如何使用它们。
您没有显示您的代理是如何实例化的,但您需要实例化一个代理以通过 RPC 连接到节点,如下所示:
val rpcAddress = NetworkHostAndPort(host, rpcPort)
val rpcClient = CordaRPCClient(rpcAddress)
val rpcConnection = rpcClient.start(username, password)
proxy = rpcConnection.proxy
一旦有了代理,就可以创建 SpringBoot API 来调用进行 RPC 调用的代理:
@RestController
@RequestMapping("/")
class StandardController(rpc: NodeRPCConnection) {
private val proxy = rpc.proxy
@GetMapping(value = ["/addresses"], produces = arrayOf("text/plain"))
private fun addresses() = proxy.nodeInfo().addresses.toString()
@GetMapping(value = ["/identities"], produces = arrayOf("text/plain"))
private fun identities() = proxy.nodeInfo().legalIdentities.toString()
推荐阅读
- java - 在java中使用其他类的变量
- aws-lambda - 对于 AWS Cloudwatch 中的 Lambda,overProvisioned Memory 意味着什么?
- java - 如何在 android studio java 中使用 OkHttpClient 发布多个图像?
- r - R基于双字符分隔符分割字符串
- python - 在 Python numpy 中计算两个二维数组的不同非零值
- java - 如何将具有数组的 JSON 转换为 Java 对象
- google-sheets - 如何在 google 表格中编写宏以刷新 bigquery 数据连接器?
- c++ - inotify 是一次性解决方案吗
- magento - whatsapp 分享链接 url 甚至没有显示描述和缩略图 magento 1.9
- javascript - 如何在 php 中调整保证金会话闪存?