Swagger Spring Access-Control-Allow-Origin。

时间:2013-09-10 22:17:49

标签: spring heroku swagger

我有一个Spring Swagger应用程序,我可以在localhost上成功运行。但是当我在Heroku上运行相同的项目时,我收到以下错误:

  

XMLHttpRequest无法加载http://force-com-rest-swagger.herokuapp.com/api/doc/api/v1/account。 Access-Control-Allow-Origin不允许原点https://force-com-rest-swagger.herokuapp.com

下面是我的swagger js config:

<script type="text/javascript" th:inline="javascript">
    $(document).ready(function () {

        displaySwaggerDocuments();

        function displaySwaggerDocuments() {
            var url = '<c:url value="/api/resourceList"/>';
            window.swaggerUi = new SwaggerUi({
                discoveryUrl: url,
                dom_id: "swagger-ui-container",
                supportHeaderParams: false,
                supportedSubmitMethods: ['get', 'post', 'put', 'delete'],
                apiKey: "",
                onComplete: function (swaggerApi, swaggerUi) {
                    if (console) {
                        console.log("Loaded SwaggerUI")
                        console.log(swaggerApi);
                        console.log(swaggerUi);
                    }
                    $('pre code').each(function (i, e) {
                        hljs.highlightBlock(e)
                    });
                },
                onFailure: function (data) {
                    if (console) {
                        console.log("Unable to Load SwaggerUI");
                        console.log(data);
                    }
                },
                docExpansion: "none"
            });

            window.swaggerUi.load();
        }
    });
</script>

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

基本上,您需要在服务器中启用CORS - 也许您的localhost启用了它,但Heroku中没有启用它(我对Heroku一无所知)。

您需要服务器返回以下标题:

Access-Control-Allow-Methods:POST,GET,OPTIONS,PUT

Access-Control-Allow-Origin:*

通常,这是通过添加一个过滤器来完成的,该过滤器将其添加到所有Swagger请求(源自您的Swagger UI的请求)

您可以在 Swagger sources.

中找到相关示例

更新:我到Swagger来源中确切位置的链接已经死了;这是their current repository.

的链接

答案 1 :(得分:1)

解决方案是设置basePath:

package com.example.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.knappsack.swagger4springweb.controller.ApiDocumentationController;

@Controller
@RequestMapping("/api")
public class ApiController extends ApiDocumentationController{

        public ApiController() {
        setBasePath("https://force-com-rest-swagger.herokuapp.com");
        setBaseControllerPackage("com.example.controller.api");
        setBaseModelPackage("com.example.model");
        setApiVersion("v1");
    }

        @RequestMapping(value = "/", method = RequestMethod.GET)
            public String documentation() {
                return "api";
        }
}