REST:如何发送YAML有效负载(Java)

时间:2018-10-09 09:44:22

标签: java rest jackson jersey yaml

一个人如何使用Java将yml负载发送到POST入口点。


环境

请求:

  • 语言:Java
  • 使用的lib:球衣

目标(已经存在):

  • REST端点
  • 输入POST
  • 有效内容YAML

代码

我曾经用它来达到相同的目的:

curl --noproxy '*' -X POST --header 'content-type: application/x-yml' --data-binary @file.yaml --url "http://my.yaml.endpoint.com"

我尝试过这样的事情:

private Client client;
private ObjectMapper mapper = new ObjectMapper(new YAMLFactory());

YMLPayload yml= null;
    try {
        yml = mapper.readValue(yml, YMLPayload.class);
    } catch (IOException e) {e.printStackTrace();}

Response res = client
                .target("http://my.yaml.endpoint.com")
                .request(/* wich mediatype? */)
                .header("content-type", "application/x-yml")
                .post(/* how to transform the data? */);

由于我是这个话题的新手,所以我可能忽略了一些东西。

2 个答案:

答案 0 :(得分:3)

在您的JAX-RS JacksonYAMLProvider中使用Client

Jackson有一个用于在JAX-RS中处理YAML序列化/反序列化的模块。它提供了将YAML内容与Java对象进行绑定所需的MessageBodyReaderMessageBodyWriter。要使用它,请将以下依赖项添加到您的项目中:

<dependency>
    <groupId>com.fasterxml.jackson.jaxrs</groupId>
    <artifactId>jackson-jaxrs-yaml-provider</artifactId>
    <version>2.9.7</version>
</dependency>

然后注册JacksonYAMLProvider类并按以下步骤执行您的请求:

Client client = ClientBuilder.newClient().register(new JacksonYAMLProvider());

Response response = client.target("http://example.org")
        .request().accept(YAMLMediaTypes.APPLICATION_JACKSON_YAML)
        .post(Entity.entity(foo, YAMLMediaTypes.APPLICATION_JACKSON_YAML_TYPE));

foo是将被序列化为YAML的对象。

如果您需要微调YAML序列化/反序列化,则可以将YAMLMapper的实例传递给JacksonYAMLProvider构造函数:

YAMLMapper mapper = new YAMLMapper();
mapper.disable(YAMLGenerator.Feature.WRITE_DOC_START_MARKER);

Client client = ClientBuilder.newClient().register(new JacksonYAMLProvider(mapper));

一旦there's no media type for YAML registered in IANA,就没有官方标准。杰克逊使用的YAML媒体类型为application/yaml。例如,如果您需要使用application/x-yml,则可以根据需要覆盖hasMatchingMediaType()中的JacksonYAMLProvider方法:

JacksonYAMLProvider jacksonYAMLProvider = new JacksonYAMLProvider() {

    @Override
    protected boolean hasMatchingMediaType(MediaType mediaType) {
        return super.hasMatchingMediaType(mediaType) ||
                "x-yml".equalsIgnoreCase(mediaType.getSubtype());
    }
};

Client client = ClientBuilder.newClient().register(jacksonYAMLProvider);

直接使用YAMLMapper

或者,您可以使用下面显示的方法,该方法不依赖于JAX-RS的Jackson YAML提供程序。

YAMLMapper mapper = new YAMLMapper();
Client client = ClientBuilder.newClient();

Response response = client.target("http://example.org")
        .request().accept("application/x-yml")
        .post(Entity.entity(mapper.writeValueAsString(foo), "application/x-yml"));

通过这种方法,直接使用YAMLMapperfoo序列化为YAML。

答案 1 :(得分:2)

根据您的后端,您可以尝试将数据作为纯字符串传递,例如:

Entity<String> ymlEntity = Entity.entity(yml, "application/x-yml");     
client.target("http://my.yaml.endpoint.com")
    .request()
    .post(e);

无论如何,发布数据的方法都是为其创建Entity<DT>