2009-10-20 15 views
7

Jestem obecnie rozwijanie API dla mojej aplikacji na RoRrequest.format powrocie */*

Jako przykład, stworzyłem niektóre XML, ładowane z wszystkich informacji trzeba utworzyć obiekt, powiedzmy, że osoba, a przy użyciu Curl złożyłam go do mojego wniosku

jestem w stanie nazwać dokładnie utworzyć akcję chcę od kontrolera i params hash obiektu są właściwie przekazywane

Ale teraz muszę zastosuj inne zachowanie, jeśli prośba została złożona lub nie z XML, co przeszkadza mi, dlaczego w kontrolerze request.format daje */*.

Jakieś wskazówki?

curl -v -H "Content-Type: application/xml; charset=utf-8" --data-ascii @client.xml http://foo.com:3000/clients?api_key=xxx 

def create 
    logger.debug request.format # produces "*/*" 
    if request.format.xml? 
    # never gets here 
    end 
end 

Odpowiedz

14

*/* oznacza, że ​​użytkownik-agent akceptuje wszystkie formaty i nie obchodzi mnie, co Format ją podać. Wierzę, że Safari to robi, między innymi. Domyślnie curl wysyła nagłówek Accept z numerem */*.

Oto zrzut z nagłówkami curl wysyła domyślnie:

User-Agent: curl/7.18.1 (i386-apple-darwin9.6.0) libcurl/7.18.1 zlib/1.2.3 
Host: example.com 
Accept: */* 
Content-Type: 

Jednak w tym przypadku, to wygląda tak, jak chcesz, aby odesłać XML jeśli ładunek wysłany do ciebie było XML? W takim przypadku należy bezpośrednio sprawdzić nagłówek Content-Type żądania. tj. request.content_type jest żądaną metodą.

Addenda: myślałem nieco więcej na ten temat i myślę, że najlepszym rozwiązaniem jest, aby najpierw sprawdzić request.format i tylko wtedy, gdy jest niejednoznaczny check request.content_type. Zasadniczo specyfikacja HTTP zapewnia, że ​​klienci mogą powiedzieć serwerom, że "Daję ci XML, ale chcę JSON z powrotem." Nagłówek Accept to sposób, w jaki klienci mówią ci, czego chcą, i jeśli ktoś faktycznie je wysyła, powinieneś to uszanować. Użyj tylko typu treści żądania jako wskazówki, jeśli klient nie określił.

+0

przeglądarka? Hmm, teraz mnie zmieszałeś. Wysyłam żądanie za pomocą wiersza poleceń, typ przeglądarki nie powinien być problemem. –

+0

Tak, przepraszam ... wyjaśnię. –

+0

Teraz ma to więcej sensu =) dziękuję –

0

*/* oznacza po prostu, że wszystkie typy MIME są akceptowane.

Patrząc na kod dla metody request.format, typ MIME jest określany przez rozszerzenie pliku lub, jeśli nie jest on obecny, przez wartość nagłówka HTTP Accept. Musisz przekazać Curl plik XML zapisany na dysku lub ustawić Curl, aby ustawić nagłówek Accept na typ MIME XML (np. text/xml), gdy wysyła żądanie do interfejsu API.

+0

Dlaczego głosowanie w dół? –

+0

To nie jest poprawne. On ** ** przekazuje plik XML. Ładunek żądania nie ma wpływu na request.format. Musisz to wykryć ręcznie. Metoda request.format używa komponentu ścieżki identyfikatora URI żądanego do uzyskania formatu. Więc jeśli Twój URI kończy się .xml, otrzyma oczekiwaną wartość. Jeśli jednak celem jest dostarczenie jednego punktu końcowego API, który obsługuje wiele typów zawartości, to nie pomoże. –

+0

Obecnie używam typu zawartości jako application/xml, zmieniono na text/xml i nadal generuje to samo żądanie.format (*/*) Plik przekazany do curl jest zapisany na dysku –