Swagger-ui отправляет только OPTIONS, а не метод POST http, несмотря на работающий API

Я использую 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"

Я просто добавил все, что было предложено. Я включил все HTTP-методы в supportSubmitMethods и протестировал API с помощью расширения POSTMAN Chrome, и он отлично работает. Правильно создает пользователя и возвращает правильные данные.

Однако все, что я получаю с сообщением о чванстве, - это отчет сервера:

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

и чванливый ответ выглядит так:

URL-адрес запроса

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

Тело ответа

Код ответа

0

Заголовки ответа

Я также проверил ответ OPTIONS с POSTMAN, и он ниже:

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

person Richard Jordan    schedule 21.12.2012    source источник
comment
ты решил это? Я застрял с той же проблемой.   -  person Neha Choudhary    schedule 13.02.2013
comment
если честно, я не могу вспомнить, решил ли я это или положил на полку - я посмотрю еще раз сегодня и отчитаюсь Неха   -  person Richard Jordan    schedule 13.02.2013
comment
это сработало. Я предоставил ему доменное имя и изменил basePath на доменное имя.   -  person Neha Choudhary    schedule 14.02.2013
comment
Это потрясающие новости... так что если у вас есть ответ, опубликуйте его, и я его приму.   -  person Richard Jordan    schedule 15.02.2013


Ответы (5)


У меня была такая же проблема, и я только что решил ее, надеюсь, это кому-то поможет.

Swagger-UI принимает несколько параметров через POST только через тип параметра «форма», а не тип параметра «тело», упомянутый в этом выпуске https://github.com/wordnik/swagger-ui/issues/72.

Я использовал ветку: git => 'git://github.com/Digication/grape-swagger.git', изменив paramType запроса "post" на "form". Сгенерированный вывод xml для swagger_doc (вероятно, в 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 для автоматической установки swagger-ui на локальный хост (файлы также можно загрузить с сайта swagger-ui), и все работает!!

person Xuwen    schedule 10.05.2013

Была такая же проблема. Исправлено добавлением 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 здесь.

person Vasiliy Sablin    schedule 18.08.2013

Приятно слышать, что вы используете виноградное чванство: я думаю, это потрясающе :)

Я не совсем уверен, что у вас такая же проблема, но при локальном тестировании из браузера он попытается проверить, совпадает ли источник с запрошенным, поэтому, чтобы убедиться, что я не получаю эту ошибку, я создал небольшое промежуточное программное обеспечение, которое сообщит браузеру, что мы разрешаем все происхождения.

Я использую процесс rails (созданный с помощью потрясающего гема rails-api), поэтому я создаю новый файл в 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

Надеюсь это поможет.

person nathanvda    schedule 08.01.2013
comment
Это не проблема CORS, которую я получаю, хотя это была более ранняя проблема, с которой я столкнулся. Я отложил это на задний план, чтобы сосредоточиться на других частях проблемы, поэтому на этой неделе я по-новому взгляну на это. - person Richard Jordan; 30.01.2013

Я не знаю решения для ruby-on-rails, так как использую Swagger с play framework 2.0.2. Я предоставил ему доменное имя и изменил basePath на доменное имя в файле application.conf как swagger.api.basepath="domain-name", и это сработало. Вы можете изменить basePath в api-docs на domain-name. Я прочитал о api-docs в api-docs. .

person Neha Choudhary    schedule 15.02.2013
comment
о, это интересно - хорошо, позвольте мне проверить это с моей реализацией Rails в течение следующих 24 часов - если работает, я нажму на галочку и проголосую :-) - person Richard Jordan; 15.02.2013

И перехватывает ли ваш веб-сервер заголовки? Например, если вы используете NGinx, ваш запрос «ОПЦИИ» в некоторых случаях может не отправлять соответствующие значения в качестве ответа.

Каков ваш ответ на запрос OPTIONS? Можешь сбросить сюда? Я скажу вам, может ли это быть так.

person nembleton    schedule 12.04.2013
comment
Это хороший вопрос. Я не проигнорировал это. Просто нужно получить возможность проверить, так как я не смотрел на это в целом. Тестирование проводилось только на локальном хосте, и я не могу вспомнить, какой сервер я использовал для этого — плохо проверю и обновлю его. - person Richard Jordan; 14.04.2013