Как программно создать и вернуть документ OpenApi 3.0 в конечной точке Spring GET? - PullRequest
0 голосов
/ 26 марта 2020

У меня есть требование, когда мне нужно иметь конечную точку GET в моем микросервисе, которая возвращает документ io.swagger.v3.oas.models.OpenAPI, и мне интересно, как составить этот объект. Объект в необработанном виде выглядит следующим образом:

{
"openapi": "3.0.1",
"info": {
"title": "MY API",
"description": "API for accessing stuff and other stuff.",
"termsOfService": "http://website.com",
"contact": {
  "name": "Some chap",
  "url": "https://website.com/s/url",
  "email": "alwaysReplyAll@office.com"
},
"version": "1.0"
},
"paths": {
"/v1/user/{id}/properties": {
  "get": { ...etc etc

я пробовал это, но документ только появляется null / blank:

@GetMapping("/openapi3")
public @ResponseBody OpenAPI swag() {
     OpenAPI swagDoc = new OpenAPI();
     GenericOpenApiContextBuilder builder = new GenericOpenApiContextBuilder();

    try {
        swagDoc = builder.buildContext(true).read();
    } catch (OpenApiConfigurationException e) {
        // handle error        
}
    return swagDoc;
}

Я читал о Springfox, но примеры в их документы не очень ясны ... и мне интересно, если это даже необходимо. что я не делаю правильно с этим строителем?

используя Gradle кстати

Ответы [ 2 ]

1 голос
/ 27 марта 2020

Согласно обсуждению в комментариях, вы можете изменить этот метод, вам не нужно использовать WebClient. Я должен получить на do c в моем сервисе swagger, и я использую этот код. Вы не вернете объект OpenAPI, вы просто вернете строку, так как у вас уже есть raw json.

getV2SwaggerDo c (новый URL ("..."));

private String getV2SwaggerDoc(URL url) throws IOException {
    HttpURLConnection connection = (HttpURLConnection)url.openConnection();

    connection.setRequestMethod(RequestMethod.GET.toString());

    BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));

    StringBuffer stringBuffer = new StringBuffer();

    String line;

    while ((line = reader.readLine()) != null)
        stringBuffer.append(line);

    reader.close();

    connection.disconnect();

    return stringBuffer.toString();
}
0 голосов
/ 28 марта 2020

Мне удалось упростить принятый ответ, используя RestTemplate Spring вместо низкоуровневого HTTP java lib

private String retrieveSwaggerJson(String url) {
    return new RestTemplate()
            .getForEntity(url, String.class)
            .getBody();
}
...