【问题标题】:REST: How to send YAML payload (Java)REST:如何发送 YAML 有效负载 (Java)
【发布时间】:2018-10-09 09:44:22
【问题描述】:

如何使用 Java 将 yml 有效负载发送到 POST 端点。


环境

请求:

  • 语言:Java
  • 使用的库:泽西岛

目标(已经存在):

  • 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? */);

由于我对这个主题相当陌生,我可能忽略了一些东西。

【问题讨论】:

  • 你面临什么问题?你有错误吗?或者您是否在询问关于可以使用的工具/方法的意见(这将是题外话)?
  • 我不知道如何告诉request,数据(YMLPayload)应该作为 yml 而不是 JSON 提交。 MediaType 不提供 YAML。而post 期望一个实体反过来提供一个方法json(Object)
  • 好的,但是您尝试的结果是什么?例如,您是否只是尝试将 yml 设置为 byte[]?
  • 感谢您的回复,但我没有尝试过,因为我也遇到了一些后端问题。我如何将它作为字节 [] 传递? post 是否接受 byte[] 作为其参数?不幸的是,我现在无法检查它,因为我不在工作。不过我明天试试。

标签: java rest jackson jersey yaml


【解决方案1】:

在您的 JAX-RS Client 中使用 JacksonYAMLProvider

Jackson 有一个用于在 JAX-RS 中处理 YAML 序列化/反序列化的模块。它提供了将 YAML 内容绑定到 Java 对象和从 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,就没有官方标准。 Jackson 使用的 YAML 媒体类型是 application/yaml。如果您需要使用application/x-yml,例如,您可以根据需要覆盖JacksonYAMLProvider 中的hasMatchingMediaType() 方法:

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"));

在这种方法中,foo 直接使用YAMLMapper 序列化为 YAML。

【讨论】:

  • 感谢您的回复。您的回答显示了一个非常详细的解决方案,并且显示了一个 pirho。
【解决方案2】:

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

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

无论如何发布数据的方法是创建一个Entity&lt;DT&gt;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-14
    • 2016-07-19
    • 1970-01-01
    • 1970-01-01
    • 2015-07-22
    • 1970-01-01
    • 2021-12-09
    • 2016-11-23
    相关资源
    最近更新 更多