【问题标题】:Swagger-ui only sending OPTIONS not POST http method despite working API尽管 API 有效,但 Swagger-ui 仅发送 OPTIONS 而不是 POST http 方法
【发布时间】:2012-12-21 12:15:31
【问题描述】:

我正在使用 Swagger-UI 浏览我自己的 API,该 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

【问题讨论】:

  • 你解决了吗?我遇到了同样的问题。
  • 老实说,我不记得我是解决了它还是把它放在架子上——我今天再看看,然后报告 Neha
  • 成功了。我为它提供了一个域名并将 basePath 更改为域名。
  • 这真是个好消息……所以如果你有答案,请发布,我会接受的。

标签: ruby-on-rails api post swagger grape-api


【解决方案1】:

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

Swagger-UI 通过 POST 接受多个参数,仅通过 'form' paramType,而不是 'body' paramType,在本期 https://github.com/wordnik/swagger-ui/issues/72 中引用。

我使用了分支 :git => 'git://github.com/Digication/grape-swagger.git' 将 'post' 请求参数类型更改为 '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站点下载),一切正常!!

【讨论】:

    【解决方案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 的位置。

    【讨论】:

      【解决方案3】:

      很高兴听到你在使用grape-swagger:我认为它很棒:)

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

      我正在使用 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
      

      希望这会有所帮助。

      【讨论】:

      • 这不是我遇到的 CORS 问题 - 尽管这是我之前遇到的问题。我把它放在次要位置,专注于问题的其他部分,所以本周我将重新审视这个问题。
      【解决方案4】:

      我不知道ruby-on-rails 的解决方案,因为我正在使用带有play framework 2.0.2 的Swagger。 我为其提供了一个域名,并将 application.conf 文件中的 basePath 更改为域名为swagger.api.basepath="domain-name" 并且它有效。 您可以将api-docs 中的basePath 更改为domain-name。我在上面读到了api-docs api-docs.

      【讨论】:

      • 哦 - 这很有趣 - 好吧,让我在接下来的 24 小时内用我的 Rails 实现检查一下 - 如果可行,我会点击复选标记并投票 :-)
      【解决方案5】:

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

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

      【讨论】:

      • 这是个好问题。我没有忽略它。只需要有机会检查一下,因为我没有整体看过这个。测试只是本地主机,我不记得我使用的是哪个服务器 - 生病检查并更新它。
      猜你喜欢
      • 2015-07-27
      • 2016-06-14
      • 1970-01-01
      • 2014-02-08
      • 2019-03-31
      • 1970-01-01
      • 2014-04-16
      • 1970-01-01
      • 2019-01-18
      相关资源
      最近更新 更多