2012-12-21 60 views
7

Używam Swagger-UI do przeglądania mojego własnego API, zbudowanego z winogron i automatycznie udokumentowanego grapefruit-chagger.Swagger-ui wysyła tylko OPCJE zamiast metody POST http pomimo działającego interfejsu API

Użyłem google i wypróbowałem każdą sugestię, którą mogę znaleźć, ale nie mogę uruchomić testu POST. Oto moje nagłówki:

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" 

Właśnie wrzuciłem wszystko, co zasugerowałem. Włączyłem wszystkie metody HTTP w supportedSubmitMethods i przetestowałem API przy użyciu rozszerzenia POSTMAN do Chrome i działa ono idealnie. Tworzy użytkownika prawidłowo i zwraca prawidłowe dane.

Jednak wszystko mam z Swagger postu jest raportowanie server:

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

i odpowiedź puszyć wygląda tak:

Zapytanie URL

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

ciała Response

Response Kod

0 

nagłówki odpowiedzi

Mam również testowane odpowiedź opcje z listonoszem i jest poniżej:

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

rozwiązałeś? Utknąłem z tym samym problemem. –

+0

Szczerze mówiąc, nie pamiętam, czy go rozwiązałem, czy położyłem na półce - przyjrzę się jeszcze raz i zgłoszę Neha –

+0

. Podałem mu nazwę domeny i zmieniłem nazwę basePath na nazwę domeny. –

Odpowiedz

0

Miło słyszeć używasz winogron puszyć: Myślę, że to jest niesamowite :)

Nie jestem do końca pewien, czy masz ten sam problem, ale podczas testowania lokalnie z przeglądarki spróbujesz sprawdzić, czy pochodzenie jest takie samo, jak żądane, więc aby się upewnić, że nie otrzymam tego błędu, utworzyłem małe oprogramowanie pośrednie, które będzie tel W przeglądarce dopuszczamy wszystkie pochodzenie.

Używam proces poręcze (utworzony z niesamowitej rails-api GEM), więc tworzę nowy plik w lib/middleware/access_control_allow_all_origin.rb o następującej treści:

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 

i na dole moich application.rb Właśnie dodaj oprogramowanie pośredniczące w następujący sposób:

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

Mam nadzieję, że to pomoże.

+0

Nie jest to kwestia CORS, którą otrzymuję - chociaż był to wcześniejszy problem, który miałem z tym. Położyłem to na tylnym palniku, aby skupić się na innych częściach problemu, więc przyjrzę się temu świeżemu w tym tygodniu. –

0

Nie wiem na temat rozwiązania dla ruby-on-rails, ponieważ używam Swagger z play framework 2.0.2. Podałem mu nazwę domeny i zmieniłem nazwę basePath na nazwę domeny w pliku application.conf jako swagger.api.basepath="domain-name" i zadziałało. Można zmienić wartość basePath w api-docs na . Przeczytałem o api-docs na api-docs.

+0

oh - to ciekawe - pozwolę sobie sprawdzić to z moją implementacją Railsów w ciągu najbliższych 24 godzin - jeśli działa, kliknę znacznik wyboru i pobiorę :-) –

0

Czy przechwytywane są nagłówki twojego serwera? Jeśli używasz na przykład NGinx, twoje żądanie "OPCJE" może w niektórych przypadkach nie wysłać odpowiednich wartości jako odpowiedzi.

Jaka jest Twoja odpowiedź na żądanie OPTIONS? Możesz go tutaj zrzucić? Powiem ci, jeśli to możliwe.

+0

To jest dobre pytanie. Nie zignorowałem tego. Po prostu musisz mieć szansę na sprawdzenie, bo nie spojrzałem na to w całości. Testowanie było tylko lokalnym hostem i nie pamiętam, z którego serwera korzystałem - źle sprawdzam i aktualizuję to. –

2

Miałem ten sam problem i po prostu go rozwiązałem, mam nadzieję, że to pomoże komuś.

Swagger-UI akceptuje wiele parametrów za pośrednictwem POST tylko za pomocą parametru typu "form", a nie "body", o którym mowa w tym numerze: https://github.com/wordnik/swagger-ui/issues/72.

Użyłem oddziału: git => 'git: //github.com/Digication/grape-swagger.git' zmiana 'post' request paramType na 'form'. Generowane wyjście xml dla swagger_doc (prawdopodobnie w ścieżce/swagger_doc/API lub podobny) powinien wyglądać mniej więcej tak:

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

Nie

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

użyłem gem grape-Swagger barierki, aby automatycznie zainstalować puszyć -ui na localhost (pliki można również pobrać ze strony internetowej swagger-ui) i wszystko działa!

2

Miał ten sam problem. Poprawiono dodając CORS

dodać do Gemfile:

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

dodać do environment.rb

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

mieć pewność, że zmieniliśmy lokalizację swojego API tutaj.