【问题标题】:How to write swagger API that accepts XML in request body如何编写在请求正文中接受 XML 的招摇 API
【发布时间】:2016-02-29 11:58:42
【问题描述】:

我们正在使用 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

但是,当我们使用 swagger-codegen 生成 Java 客户端代码时,生成的方法如下所示:

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() 方法,还是有更好的方法来做到这一点?

【问题讨论】:

    标签: java xml code-generation swagger


    【解决方案1】:

    有一个错误,大约 2 小时前已解决。请从Swagger-Codegen 拉取最新的,Java API 客户端中的参数request 应该是字符串而不是模型。

    【讨论】:

    • 谢谢。您能否提供有关问题或修复的参考?无论如何,这有助于但不能解决问题,因为调用失败是因为它调用了期望其有效负载为 JSON 的 serialize(),如果不是则抛出异常。见github.com/swagger-api/swagger-codegen/blob/master/modules/…
    • 我得到这个异常: 原因:io.swagger.client.ApiException: 无法将对象序列化为 Content-Type: application/xml at io.swagger.client.ApiClient.serialize(ApiClient.java :386) 在 io.swagger.client.ApiClient.getAPIResponse(ApiClient.java:493) 在 io.swagger.client.ApiClient.invokeAPI(ApiClient.java:540)
    • 请在github.com/swagger-api/swagger-codegen/issues/new 提出问题,我们会对此进行调查。
    【解决方案2】:

    对我来说快速的解决方法是在序列化方法中添加另一个 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());
    }
    

    这对我有用,我希望它有帮助

    【讨论】:

    • 并使用 @XmlRootElement 注释您的模型类
    猜你喜欢
    • 1970-01-01
    • 2021-04-19
    • 2021-07-08
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 2020-02-24
    • 1970-01-01
    相关资源
    最近更新 更多