GraphQL-запрос с объектом с использованием americanexpress / node - PullRequest
0 голосов
/ 29 октября 2018

Я использую Клиент GraphQL JVM от American Express

Это запрос, который мне нравится строить:

exercise {
  id
  name
  images(resize: {width: 512, height: 288, background: "ffffff"})
}

Это DTO, который я создал:

@GraphQLProperty(name = "exercise")
public class Exercise {

  private Integer id;

  private String name;

  @GraphQLProperty(name = "images", arguments = {@GraphQLArgument(name = "resize")})
  private List<String> images;

  public Integer getId() {
    return id;
  }

  public void setId(Integer id) {
    this.id = id;
  }

  public List<String> getImages() {
    return images;
  }

  public void setImages(List<String> images) {
    this.images = images;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public Exercise() {
  }
}

Вот как я хочу построить запрос:

GraphQLTemplate graphQLTemplate = new GraphQLTemplate();

GraphQLRequestEntity requestEntity = GraphQLRequestEntity.Builder()
    .url("https://domain/graphql")
    .arguments(
        new Arguments("exercise.images", new Argument("resize", ?))
    )
    .request(Exercise.class)
    .build();

Но я не понимаю правильное выражение для?.

Вопрос в том, как передать структурированные параметры в качестве аргумента?

Ответы [ 2 ]

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

Решением этой проблемы является использование класса InputObject. Ваш DTO может оставаться точно таким, как он определен, просто добавьте аргумент так:

GraphQLTemplate graphQLTemplate = new GraphQLTemplate();

InputObject resizeInput = new InputObject.Builder()
  .put("width", 512)
  .put("height", 288)
  .put("background", "ffffff")
  .build();

GraphQLRequestEntity requestEntity = GraphQLRequestEntity.Builder()
    .url("https://domain/graphql")
    .arguments(
        new Arguments("exercise.images", new Argument("resize", resizeInput))
    )
    .request(Exercise.class)
    .build();

Вы можете прочитать больше об этом и некоторых других API, используемых в этом посте (https://americanexpress.io/graphql-for-the-jvm/)

).

Надеюсь, это поможет!

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

Хорошо, я нашел решение, работающее на меня ...

Я создал «переменный» класс

public class ResizeVariable {

  private String background;

  public ResizeVariable() {
  }

  public ResizeVariable(String background) {
    this.background = background;
  }

  public String getBackground() {
    return background;
  }

  public void setBackground(String background) {
    this.background = background;
  }

  @Override
  public String toString() {
    return "{background: \""+background+"\"}";
  }

}

и отсутствующее было переопределением метода toString (). Тогда это возможно:

GraphQLTemplate graphQLTemplate = new GraphQLTemplate();

GraphQLRequestEntity requestEntity = GraphQLRequestEntity.Builder()
  .url("https://domain/graphql")
  .arguments(
    new Arguments("exercise.images",
      new Argument("resize", new ResizeVariable("ffffff")))
  )
  .request(Exercise.class)
  .build();

, что приводит к правильному запросу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...