Как написать swagger API, который принимает XML в теле запроса

Мы используем Swagger для написания нашего REST API. У нас есть служба POST, которая должна принимать файл XML в теле запроса. Это определение нашего запроса:

  /services/invoke:
    post:
      tags:
        - invoke
      summary: A request invocation
      operationId: invokeUsingPOST
      consumes:
        - application/xml
      produces:
        - application/xml
      parameters:
        - name: User-Token
          in: header
          description: The user token
          required: false
          type: string
        - in: body
          name: request
          description: invoke request XML
          required: false
          schema:
            type: string
      responses:
        '200':
          description: OK
          schema:
            type: string
        '400':
          description: Bad Operation
        '401':
          description: Unauthorized
        '404':
          description: Forbidden

Однако когда мы генерируем клиентский код Java с помощью swagger-codegen, сгенерированный метод выглядит так:

public String invokeUsingPOST (String userToken, Request request)

И класс запроса генерируется как:

@ApiModel(description = "")
@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2015-11-25T18:45:31.524+02:00")
public class Request   {
  @Override
  public String toString()  {
    StringBuilder sb = new StringBuilder();
    sb.append("class Request {\n");
    sb.append("}");
    return sb.toString();
  }
}

Как мне использовать его для отправки моего XML? Должен ли я получить от него и переопределить метод toString(), или есть лучший способ сделать это?


person splintor    schedule 26.11.2015    source источник


Ответы (2)


Есть ошибка, которую устранили около 2 часов назад. Загрузите последнюю версию с Swagger-Codegen, а параметр request в клиенте API Java должен быть строка вместо модели.

person William Cheng    schedule 26.11.2015
comment
Спасибо. Можете ли вы дать ссылку на проблему или исправление? В любом случае, это помогает, но не устраняет проблему, так как вызов завершается сбоем, потому что он вызывает serialize(), который ожидает, что его полезная нагрузка будет JSON, и выдает исключение, если это не так. См. github.com/swagger-api/swagger-codegen/blob/master/modules/ - person splintor; 26.11.2015
comment
Я получаю это исключение: Вызвано: io.swagger.client.ApiException: невозможно сериализовать объект в Content-Type: application/xml в io.swagger.client.ApiClient.serialize(ApiClient.java:386) в io.swagger. client.ApiClient.getAPIResponse(ApiClient.java:493) в io.swagger.client.ApiClient.invokeAPI(ApiClient.java:540) - person splintor; 26.11.2015
comment
Пожалуйста, откройте задачу на github.com/swagger-api/swagger-codegen/issues. /new и мы рассмотрим это. - person William Cheng; 27.11.2015

Быстрый обходной путь для меня - добавить еще один else if в метод сериализации для проверки того, является ли тип контента "application/xml"

} else if (contentType.equals("application/xml")) {
            SerializerUtils s = new SerializerUtils();
            return s.serializeRequestBody(contentType, obj);
}

и SerializerUtils имеют эти 2 метода

public class SerializerUtils {

public Marshaller registerSerializer(Class<?> modelClass) throws JAXBException {
    JAXBContext jaxbContext = JAXBContext.newInstance(modelClass);

    Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
    jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
    return jaxbMarshaller;
}

public RequestBody serializeRequestBody(String contentType, Object obj) {
    StringWriter sw = new StringWriter();
    try {
        registerSerializer(obj.getClass()).marshal(obj, sw);

    } catch (JAXBException e) {
        e.printStackTrace();
    }
    return RequestBody.create(MediaType.parse(contentType), sw.toString());
}

Это работает для меня, и я надеюсь, что это поможет

person Vlado Lesko    schedule 21.08.2017
comment
и аннотируйте свои классы моделей с помощью @XmlRootElement - person Vlado Lesko; 21.08.2017