【问题标题】:Swagger Spring Access-Control-Allow-Origin.Swagger Spring Access-Control-Allow-Origin。
【发布时间】:2013-09-14 19:09:36
【问题描述】:

我有一个 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 配置:

<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>

有什么建议吗?

【问题讨论】:

    标签: spring heroku swagger


    【解决方案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";
            }
    }
    

    【讨论】:

      【解决方案2】:

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

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

      访问控制允许方法:POST、GET、OPTIONS、PUT

      访问控制允许来源:*

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

      您可以在 Swagger sources. 中找到一个这样的例子

      更新:我指向 Swagger 源中确切位置的链接已失效;这是their current repository.的链接

      【讨论】:

      • 上面招摇的来源的死链接。
      • 是的。我不知道它今天在 Swagger 源中的位置,但我会用相关存储库的链接更新答案。
      • github 链接的哪一部分与 CORS 支持相关? swagger api 很容易上手。
      • 我已经多年没有使用 Swagger 了,所以我不知道我最初发布的课程会取代什么课程。
      猜你喜欢
      • 2020-05-27
      • 2017-06-15
      • 2016-09-30
      • 2015-06-17
      • 2023-01-13
      • 2017-12-29
      • 2019-02-07
      • 2013-09-09
      相关资源
      最近更新 更多