7

我正在使用 Swagger-UI 来浏览我自己的 API,它是用葡萄构建的,并用葡萄招摇自动记录。

我已经用谷歌搜索并尝试了我能找到的每一个建议,但我无法让 POST 工作。这是我的标题:

  header "Access-Control-Allow-Origin", "*"
  header "Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, PATCH, DELETE"
  header "Access-Control-Request-Method", "*"
  header "Access-Control-Max-Age", "1728000"
  header "Access-Control-Allow-Headers", "api_key, Content-Type"

我只是提出了所有建议。我已经在supportedSubmitMethods 中启用了所有HTTP 方法,并且我已经使用POSTMAN Chrome 扩展测试了API,它运行良好。正确创建用户并返回正确的数据。

然而,我通过招摇的帖子得到的只是服务器报告:

Started OPTIONS "/v1/users.json" for 127.0.0.1 at 2012-12-21 04:07:13 -0800

和招摇的反应看起来像这样:

请求网址

http://api.lvh.me:3000/v1/users.json

响应体

响应代码

0

响应标头

我还用 POSTMAN 测试了 OPTIONS 响应,如下所示:

Allow →OPTIONS, GET, POST
Cache-Control →no-cache
Date →Fri, 21 Dec 2012 12:14:27 GMT
Server →Apache-Coyote/1.1
X-Request-Id →9215cba8da86824b97c6900fb6d97aec
X-Runtime →0.170000
X-UA-Compatible →IE=Edge
4

5 回答 5

3

我遇到了同样的问题,刚刚解决了,希望这对某人有所帮助。

Swagger-UI 通过 POST 接受多个参数,仅通过“表单”参数类型,而不是“正文”参数类型,在本期https://github.com/wordnik/swagger-ui/issues/72中引用。

我使用了分支:git => 'git://github.com/Digication/grape-swagger.git' 将 'post' 请求 paramType 更改为 'form'。为 swagger_doc 生成的 xml 输出(可能位于 path/swagger_doc/api 或类似位置)应如下所示:

<api>
  <path>/api/v2/...</path>
    <operations type="array">
      ...
      <httpMethod>POST</httpMethod>
        <parameters type="array">
          <parameter>
            <paramType>form</paramType>
            ...More

不是

<paramType>body</paramType>
...More

我使用grape-swagger-rails gem 在localhost 上自动安装swagger-ui(文件也可以从swagger-ui 站点下载),一切正常!!

于 2013-05-10T21:22:19.583 回答
2

有同样的问题。通过添加 CORS 修复

添加到 Gemfile:

gem 'rack-cors', :require => 'rack/cors'

添加到 application.rb

config.middleware.use Rack::Cors do
    allow do
      origins '*'
      # location of your API
      resource '/*', :headers => :any, :methods => [:get, :post, :options, :put]
    end
end

确保您在此处更改了 API 的位置。

于 2013-08-18T12:02:40.520 回答
0

我不知道解决方案,ruby-on-rails因为我将 Swagger 与play framework 2.0.2. 我为它提供了一个域名,并将 basePath 更改为 application.conf 文件中的域名,swagger.api.basepath="domain-name"并且它工作正常。您可以将basePathin更改api-docsdomain-name. 我阅读了api-docs关于 api-docs的信息。

于 2013-02-15T05:43:32.570 回答
0

您的网络服务器是否劫持了标头?例如,如果您使用 NGinx,在某些情况下,您的“OPTIONS”请求可能不会发送适当的值作为响应。

您的 OPTIONS 请求响应是什么?你能把它扔在这里吗?我会告诉你是否可以。

于 2013-04-12T05:36:40.427 回答
0

很高兴听到你在使用葡萄招摇:我认为这很棒:)

我不完全确定你有同样的问题,但是当从浏览器进行本地测试时,它会尝试检查来源是否与请求的相同,所以为了确保我没有收到那个错误,我创建了一个小的中间件将告诉浏览器我们允许所有来源。

我正在使用 rails 进程(使用出色的 rails-api gem 创建),因此我创建了一个lib/middleware/access_control_allow_all_origin.rb包含以下内容的新文件:

module Middleware
  class AccessControlAllowAllOrigin

    def initialize(app)
      @app = app
    end

    def call(env)
      status, headers, body = @app.call(env)
      allow_all_origin!(headers)
      [status, headers, body]
    end

    private

    def allow_all_origin!(headers)
      headers['Access-Control-Allow-Origin'] = '*'
      headers['Access-Control-Request-Method'] = '*'
    end

  end
end

在我的底部,我application.rb只是添加了中间件,如下所示:

require 'middleware/access_control_allow_all_origin'
config.middleware.insert_after Rack::ETag, Middleware::AccessControlAllowAllOrigin

希望这可以帮助。

于 2013-01-08T22:46:15.087 回答