REST:如何发送 YAML 负载 (Java)
REST: How to send YAML payload (Java)
如何使用 Java.
将 yml 负载发送到 POST entpoint
环境
要求:
- 语言: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? */);
由于我对这个主题还很陌生,所以我可能忽略了一些东西。
根据您的后端,您可以尝试将数据作为纯字符串传递,例如:
Entity<String> ymlEntity = Entity.entity(yml, "application/x-yml");
client.target("http://my.yaml.endpoint.com")
.request()
.post(e);
无论如何 post 数据的方法是创建它的 Entity<DT>
。
在您的 JAX-RS Client
中使用 JacksonYAMLProvider
Jackson 有一个用于在 JAX-RS 中处理 YAML serialization/deserialization 的模块。它提供了将 YAML 内容绑定到 Java 对象和从 Java 对象绑定所需的 MessageBodyReader
and MessageBodyWriter
。要使用它,请将以下依赖项添加到您的项目中:
<dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-yaml-provider</artifactId>
<version>2.9.7</version>
</dependency>
然后注册 JacksonYAMLProvider
class 并按如下方式执行您的请求:
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 serialization/deserialization,可以将 YAMLMapper
的实例传递给 JacksonYAMLProvider
构造函数:
YAMLMapper mapper = new YAMLMapper();
mapper.disable(YAMLGenerator.Feature.WRITE_DOC_START_MARKER);
Client client = ClientBuilder.newClient().register(new JacksonYAMLProvider(mapper));
一旦 IANA 中没有注册 YAML 的媒体类型,就没有官方标准。 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。
如何使用 Java.
将 yml 负载发送到 POST entpoint环境
要求:
- 语言: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? */);
由于我对这个主题还很陌生,所以我可能忽略了一些东西。
根据您的后端,您可以尝试将数据作为纯字符串传递,例如:
Entity<String> ymlEntity = Entity.entity(yml, "application/x-yml");
client.target("http://my.yaml.endpoint.com")
.request()
.post(e);
无论如何 post 数据的方法是创建它的 Entity<DT>
。
在您的 JAX-RS Client
中使用 JacksonYAMLProvider
Jackson 有一个用于在 JAX-RS 中处理 YAML serialization/deserialization 的模块。它提供了将 YAML 内容绑定到 Java 对象和从 Java 对象绑定所需的 MessageBodyReader
and MessageBodyWriter
。要使用它,请将以下依赖项添加到您的项目中:
<dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-yaml-provider</artifactId>
<version>2.9.7</version>
</dependency>
然后注册 JacksonYAMLProvider
class 并按如下方式执行您的请求:
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 serialization/deserialization,可以将 YAMLMapper
的实例传递给 JacksonYAMLProvider
构造函数:
YAMLMapper mapper = new YAMLMapper();
mapper.disable(YAMLGenerator.Feature.WRITE_DOC_START_MARKER);
Client client = ClientBuilder.newClient().register(new JacksonYAMLProvider(mapper));
一旦 IANA 中没有注册 YAML 的媒体类型,就没有官方标准。 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。