1

我有一个 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 。

下面是我的招摇 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>

有什么建议么?

4

2 回答 2

1

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

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

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

访问控制允许来源:*

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

您可以在Swagger 源代码中找到这方面的示例。

更新:我指向 Swagger 资源中确切位置的链接已失效;这是他们当前存储库的链接。

于 2013-09-22T14:42:40.577 回答
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";
        }
}
于 2014-01-10T19:29:31.793 回答