2016-03-30 2 views
2

Я использовал проект swagger create для поддержки API для обслуживания узлов. Я следовал these instructions. Я также использую инструменты swagger для обслуживания swagger-ui.Изменить basePath for swagger-ui

Я хотел бы динамически изменить basePath API и его документацию с '/' и '/ docs' на routingPath и routingPath + '/ docs.

Я могу изменить basePath моей спецификации API swagger, но я не уверен, как изменить basePath swagger-ui. Мой код выглядит следующим образом:

'use strict'; 

const defaultRoutingPath = '/api/collection'; 
const defaultPort = 3000; 

var path = require('path'); 
var SwaggerExpress = require('swagger-express-mw'); 
var SwaggerUi = require('swagger-tools/middleware/swagger-ui'); 
var app = require('express')(); 
module.exports = app; // for testing 

var routingPath = process.env.ROUTING_PATH || defaultRoutingPath; 

var config = { 
    appRoot: __dirname // required config 
}; 

SwaggerExpress.create(config, function(err, swaggerExpress) { 
    if (err) { throw err; } 

    swaggerExpress.runner.swagger.basePath = routingPath; // this works 

    app.get('/', (req, res) => { 
    res.redirect(path.join(routingPath, 'docs')); 
    }) 

    // enable SwaggerUI 
    app.use(swaggerExpress.runner.swaggerTools.swaggerUi({ 
    basePath: routingPath // this has no effect 
    })); 

    // install middleware 
    swaggerExpress.register(app); 

    var port = process.env.PORT || defaultPort; 
    app.listen(port); 

    if (swaggerExpress.runner.swagger.paths['/hello']) { 
    console.log('try this:\ncurl http://127.0.0.1:' + port + path.join(routingPath, '/hello?name=Scott')); 
    } 
}); 

Если я запускаю эту услугу, я найти свой API спецификации на http://localhost:3000/api/collection

И мою страницу DOCS на http://localhost:3000/docs

Я хотел бы служить документы page at http://localhost:3000/api/collection/docs

Я попытался сделать это, передав параметр basePath в конструктор swaggerUi.

// enable SwaggerUI 
    app.use(swaggerExpress.runner.swaggerTools.swaggerUi({ 
    basePath: routingPath // this has no effect 
    })); 

Это не сработало. Кто-нибудь знает, как настроить basePath для swagger-ui?

ответ

1

Я выяснил ответ на мой вопрос, следующий по существу this guidance.

Ключ должен был добавить второе экспресс-приложение (подпуть) и использовать routingPath из основного приложения. Вот код.

'use strict'; 

const defaultRoutingPath = '/api/collection'; 
const defaultPort = 80; 

var path = require('path'); 
var SwaggerExpress = require('swagger-express-mw'); 
var SwaggerUi = require('swagger-tools/middleware/swagger-ui'); 
var express = require('express'); 
var app = express(); 
var subpath = express(); 
module.exports = app; // for testing 

var routingPath = process.env.ROUTING_PATH || defaultRoutingPath; 

var config = { 
    appRoot: __dirname, // required config 
}; 

SwaggerExpress.create(config, function(err, swaggerExpress) { 
    if (err) { throw err; } 

    app.use(routingPath, subpath); 

    app.get('/', (req, res) => { 
    res.redirect(path.join(routingPath, 'docs')); 
    }) 

    swaggerExpress.runner.swagger.basePath = routingPath; 

    // enable SwaggerUI 
    subpath.use(swaggerExpress.runner.swaggerTools.swaggerUi()); 

    // install middleware 
    swaggerExpress.register(app); 

    var port = process.env.PORT || defaultPort; 
    app.listen(port); 

    if (swaggerExpress.runner.swagger.paths['/health']) { 
    console.log('try this:\ncurl http://127.0.0.1:' + port + path.join(routingPath, '/health')); 
    } 
}); 

Теперь мои документы доступны здесь: http://localhost:3000/api/collection/docs/

0

Использование пружинного сапог я мог переназначить

public class CustomResourceMapping extends WebMvcConfigurerAdapter { 
    @Override 
    public void addViewControllers(ViewControllerRegistry registry) { 
     registry.addRedirectViewController(
     "/configuration/ui", 
     "/swagger-resources/configuration/ui"); 
     registry.addRedirectViewController(
     "/configuration/security", 
     "/swagger-resources/configuration/security"); 
    } 
} 

, но все еще есть проблемы, часть док генерируется, то ошибка javascript:

Navigated to http://localhost:8080/swagger-ui.html jquery-1.8.0.min.js:2 
XHR finished loading: GET "http://localhost:8080/configuration/ui".     jquery-1.8.0.min.js:2 
XHR finished loading: GET "http://localhost:8080/swagger-resources".    jquery-1.8.0.min.js:2 
XHR finished loading: GET "http://localhost:8080/v2/api-docs".      swagger-ui.min.js:10 
swagger-ui.min.js:1 Uncaught TypeError: Cannot read property 'type' of undefined swagger-ui.min.js:1 
    at Object.<anonymous> (swagger-ui.min.js:1) 
    at Object.10 (swagger-ui.min.js:2) 
    at Object.f [as inverse] (handlebars-2.0.0.js:27) 
    at Object.<anonymous> (handlebars-2.0.0.js:27) 
    at Object.9 (swagger-ui.min.js:2) 
    at Object.f [as inverse] (handlebars-2.0.0.js:27) 
    at Object.<anonymous> (handlebars-2.0.0.js:27) 
    at Object.main (swagger-ui.min.js:2) 
    at e (handlebars-2.0.0.js:27) 
    at s.render (swagger-ui.min.js:10)