REST: Как отправить полезную нагрузку YAML (Java) - PullRequest
0 голосов
/ 09 октября 2018

Как отправить полезную нагрузку yml на точку POST с помощью Java.


Среда

Запрос:

  • язык: 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? */);

Поскольку я довольно новичок в этой теме, я мог что-то упустить из виду.

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Использование JacksonYAMLProvider в вашем JAX-RS Client

У Джексона есть модуль для обработки сериализации / десериализации YAML в JAX-RS.Он предоставляет MessageBodyReader и MessageBodyWriter, необходимые для привязки содержимого YAML к объектам Java и из них.Чтобы использовать его, добавьте в свой проект следующую зависимость:

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

Как только для IAML не зарегистрирован тип носителя, зарегистрированный в 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 напрямую

В качестве альтернативы, вы могли бы использовать подход, показанный ниже, который не зависит от провайдера Jackson YAML для JAX-RS.

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 сериализуется как YAML с использованием YAMLMapper напрямую.

0 голосов
/ 10 октября 2018

В зависимости от вашего бэкэнда вы можете попытаться передать данные в виде простой строки, например:

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

В любом случае, способ публикации данных - создать Entity<DT> из них.

...