如何 post 在 micronaut 中使用生成的客户端
How to post with generated client in micronaut
post在 micronaut 中访问一个简单的 hello 控制器时出现错误。客户端似乎 posting 为 application/json 但控制器期望 text/plain。如何将客户端固定为 post 为 text/plain?
HelloController.java
@Post(value = "/helloBody/{name}", consumes = MediaType.TEXT_PLAIN)
public Single<String> helloBody(@NotBlank String name, @NotBlank @Body String text) {
return Single.just(name + "sent: " + text);
}
HelloClient.java
@Post(value = "/helloBody/{name}")
Single<String> helloBody(@NotBlank String name, @NotBlank String body);
HelloControllerTest.java
@Test
void testPost() {
String body = client.helloBody("John", "message").blockingGet();
assertThat(body).isEqualTo("John sent: message");
}
错误
io.micronaut.http.client.exceptions.HttpClientResponseException: Content Type [application/json] not allowed. Allowed types: [text/plain]
at io.micronaut.http.client.DefaultHttpClient.channelRead0(DefaultHttpClient.java:1799)
at io.micronaut.http.client.DefaultHttpClient.channelRead0(DefaultHttpClient.java:1739)
at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:105)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360)
...
您可以通过告诉客户端发送后端期望的 text/plain
来更改此设置。
@Post(value = "/helloBody/{name}", consumes = MediaType.TEXT_PLAIN, produces = MediaType.TEXT_PLAIN)
Single<String> helloBody(@NotBlank String name, @NotBlank String body);
Micronaut 的想法是让 Web 操作 可在控制器和客户端之间共享。
让我们考虑一个名为 HelloOperations
的接口。这是您的 Web 界面,可以在客户端和服务器之间共享。
@Validated
public interface HelloOperations {
@Post(value = "/helloBody/{name}", consumes = MediaType.TEXT_PLAIN)
Single<String> helloBody(@NotBlank String name, @NotBlank @Body String text);
}
现在您开始在后端使用控制器实现来实现合约,例如
@Controller
public class HelloController implements HelloOperations {
@Override
public Single<String> helloBody(String name, String text) {
// do something in here...
}
}
之后你在客户端继续。
@Client
public interface HelloWorldClient extends HelloOperations {
@Override
Single<String> helloBody(String name, String text);
}
等等。您已成功连接它们。
可以在位于 https://docs.micronaut.io/latest/guide/index.html#clientAnnotation
的 Micronaut 文档中找到更多解释
post在 micronaut 中访问一个简单的 hello 控制器时出现错误。客户端似乎 posting 为 application/json 但控制器期望 text/plain。如何将客户端固定为 post 为 text/plain?
HelloController.java
@Post(value = "/helloBody/{name}", consumes = MediaType.TEXT_PLAIN)
public Single<String> helloBody(@NotBlank String name, @NotBlank @Body String text) {
return Single.just(name + "sent: " + text);
}
HelloClient.java
@Post(value = "/helloBody/{name}")
Single<String> helloBody(@NotBlank String name, @NotBlank String body);
HelloControllerTest.java
@Test
void testPost() {
String body = client.helloBody("John", "message").blockingGet();
assertThat(body).isEqualTo("John sent: message");
}
错误
io.micronaut.http.client.exceptions.HttpClientResponseException: Content Type [application/json] not allowed. Allowed types: [text/plain]
at io.micronaut.http.client.DefaultHttpClient.channelRead0(DefaultHttpClient.java:1799)
at io.micronaut.http.client.DefaultHttpClient.channelRead0(DefaultHttpClient.java:1739)
at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:105)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360)
...
您可以通过告诉客户端发送后端期望的 text/plain
来更改此设置。
@Post(value = "/helloBody/{name}", consumes = MediaType.TEXT_PLAIN, produces = MediaType.TEXT_PLAIN)
Single<String> helloBody(@NotBlank String name, @NotBlank String body);
Micronaut 的想法是让 Web 操作 可在控制器和客户端之间共享。
让我们考虑一个名为 HelloOperations
的接口。这是您的 Web 界面,可以在客户端和服务器之间共享。
@Validated
public interface HelloOperations {
@Post(value = "/helloBody/{name}", consumes = MediaType.TEXT_PLAIN)
Single<String> helloBody(@NotBlank String name, @NotBlank @Body String text);
}
现在您开始在后端使用控制器实现来实现合约,例如
@Controller
public class HelloController implements HelloOperations {
@Override
public Single<String> helloBody(String name, String text) {
// do something in here...
}
}
之后你在客户端继续。
@Client
public interface HelloWorldClient extends HelloOperations {
@Override
Single<String> helloBody(String name, String text);
}
等等。您已成功连接它们。
可以在位于 https://docs.micronaut.io/latest/guide/index.html#clientAnnotation
的 Micronaut 文档中找到更多解释