我正在与quarkus restclient进行斗争。
首先创建一个简单打印请求主体的控制器:例如。
@Path("/test")
public class ExampleController {
@PUT
public void test(String data) {
System.out.println(data);
}
}
现在我们创建一个restclient,它接受任何对象作为请求主体:
@RegisterRestClient(baseUri = "http://localhost:8081/test")
public interface RestClientExample {
@PUT
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
void put(Object data);
}
请注意我们说 @Consumes(MediaType.APPLICATION_JSON)
因此,在请求过程中,主体应该序列化json。
进行快速测试:
@QuarkusTest
class TestPrimitives {
@Inject
@RestClient
RestClientExample example;
@Test
void test() {
example.put("hello\nworld");
example.put(new TestRequest());
}
public static class TestRequest {
private String data = "hello\nworld";
public String getData() {
return data;
}
}
}
您将看到:
hello
world
{"data":"hello\nworld"}
如果您发送的任何类型的对象都不是primitve,那么主体将作为json响应。如果发送一个字符串,则正文不是json序列化的(linebreak应该是一个 \n
就像第二个请求)。不幸的是,我还需要字符串序列化。我怎样才能做到?
更新
所以我可以更好地理解:将控制器替换为:所以我们进行json解析。
@PUT
@Consumes(MediaType.APPLICATION_JSON)
public void test(String data) {
System.out.println(Json.createReader(new StringReader(data)).readValue());
}
这将失败:
Caused by: javax.json.stream.JsonParsingException: Unexpected char 104 at (line no=1, column no=1, offset=0)
at org.glassfish.json.JsonTokenizer.unexpectedChar(JsonTokenizer.java:577)
1条答案
按热度按时间bzzcjhmw1#
不幸的是,您告诉您的rest客户机发送json,并且字符串是有效的json对象,因此您的结果是合乎逻辑的。
当您使用system.out记录字符串时
\n
字符显示为换行符。对我来说,这段代码没有什么问题,它的工作应该是正常的。
如果你真的想要
\n
要不被评估为换行符,需要对\
从调用站点(rest客户机代码正常)