Как получить JSON от RestController Spring Boot в Netty Client - PullRequest
0 голосов
/ 08 мая 2020

Я запускаю симуляцию Spring Boot, чтобы получить JSON. И клиент Netty, настроенный для HTTP, отправит запрос на получение JSON.

Однако в моем коде это не работает. Мой код выглядит следующим образом.

This is the RestController
@RestController
@RequestMapping("/")
class BasicJsonController {

    private val logger = LoggerFactory.getLogger(this.javaClass)

    @Autowired
    lateinit var robot: RandomRobot

    @GetMapping("/robot")
    fun getJson(): String? {
        logger.info("Get the JSON")
        return JSON.toJSONString(robot.getRobot())
    }
}

А вот и клиент Netty

@Component
@Order(1)
class RobotNettyClient : ApplicationRunner{

    private val logger = LoggerFactory.getLogger(this.javaClass)

    override fun run(args: ApplicationArguments?) {
        val group = NioEventLoopGroup()

        try {
            val bootstrap = Bootstrap()
            bootstrap.group(group)
                    .channel(NioSocketChannel::class.java)
                    .option(ChannelOption.SO_KEEPALIVE, true)
                    .handler(object: ChannelInitializer<SocketChannel>() {
                        override fun initChannel(ch: SocketChannel?) {
                            val pipeline = ch?.pipeline()
//                            pipeline?.addLast(StringDecoder(Charset.defaultCharset()))
                            pipeline?.addLast(HttpRequestEncoder())
                            pipeline?.addLast(HttpContentCompressor())
//                            pipeline?.addLast(HttpObjectAggregator(65535))
                            pipeline?.addLast(RobotHandler())
                        }
                    })
            logger.info("Netty started")
            bootstrap.connect("127.0.0.1",8080).sync()
        } finally {
            group.shutdownGracefully()
        }
    }
}

Это обработчик

class RobotHandler : ChannelInboundHandlerAdapter() {

    private val logger = LoggerFactory.getLogger(this.javaClass)

    override fun channelRead(ctx: ChannelHandlerContext?, msg: Any?) {

        logger.info(msg?.toString())
    }

    override fun channelActive(ctx: ChannelHandlerContext?) {
        val request = DefaultHttpRequest(HttpVersion.HTTP_1_0, HttpMethod.GET, "/robot")


        ctx?.writeAndFlush(request)
    }

    override fun exceptionCaught(ctx: ChannelHandlerContext?, cause: Throwable?) {
        cause?.printStackTrace()
        ctx?.close()
    }
}

Это оказалось успешным в получении JSON, однако функция channelRead никогда не запускается. Как видите, я попробовал какую-то комбинацию обработчика на клиенте, и все оказалось безуспешно.

...