Przyjmowanie pliku XML (chociaż niekoniecznie XML)

W jaki sposób za pomocą Desktopowej aplikacji mogę wysłać jakiś plik, np. XML (pewnie za pomocą cURL).

Wtedy jak poznać w akcji kontrolera, że dostałem plik XML?

Albo wstaw nagłówek (opcja --header curla), albo wyślij na URLa mającego w sobie :format, czyli coś w stylu http://example.com/fubar.xml.

Zapewne przyda Ci się opcja -X, gdybyś chciał użyć PUT zamiast POST.

A w kontrolerze, jak poznać czy np. params[:xml] jest plikiem xml czy może json

Najprościej, ale bez gwarancji poprawności? Sprawdź, czy pierwszy znak pliku to “<”.

Możesz albo analizować treść, próbując rozpoznać co Ci się przysłało, albo przyjąć, że format danych musi pasować do oczekiwanego przez kontroler formatu.

Sugeruję to drugie podejście. Jeśli ścieżką, na którą Ci wysłano dane było example.com/fubar.xml to dane MUSZĄ być w formacie XML. Parsujesz je, i w razie problemów rzucasz kodem np. 422 (Unprocessable entity).
Jeżeli dane przesłano na ścieżkę example.com/fubar.json, wtedy wiesz, że plik ma być w tym właśnie formacie i działasz odpowiednio.

Jeśli będziesz miał zdefiniowany routing np tak:

map.with_options :controller => 'documents' do |doc| doc.connect 'documents/:id/children.:format' , :conditions => {:method => :post }, :action => 'create_child' , :requirements => {:id=>/[0-9]+/} end
…wtedy w akcji będziesz mógł sprawdzić params[:format] :

case params[:format] when 'xml' parse_as_xml when 'json' parse_as_json else...
Ale zadam pytanie, które powinno się zadać na samym początku: Co właściwie chcesz zrobić, tak w nieco szerszym kontekście?

Nie łatwiej i lepiej sprawdzić po prostu typ? Nawet poleceniem systemowym, choćby

gotar@laptop ~ $ file Tapetki/1280x1024.jpg Tapetki/1280x1024.jpg: JPEG image data, JFIF standard 1.02 gotar@laptop ~ $ file /usr/portage/app-crypt/openvpn-blacklist/metadata.xml /usr/portage/app-crypt/openvpn-blacklist/metadata.xml: XML document text gotar@laptop ~ $
regexp czy cokolwiek innego i wiesz

Regexp nie, ale Gotar ma dobry pomysl: przepusc wejscie przez parser xml, jak sie zwaliduje - znaczy zapisujemy!

Pod warunkiem, że chcemy tylko sprawdzić czy to jest XML czy to nie jest XML. Ale próba odgadnięcia formatu z anonimowych danych niespecjalnie mi się podoba. Kombinacji za dużo, a pamiętam też, że jakiś czas temu program ‘file’ był podatny na jakiś buffer overflow, czy inne paskudztwo.

Tam w trzecim poście matiit wspomniał o json; dlatego lepiej chyba, żeby podał jakiś przybliżony scenariusz.

No ja zawsze mam myślenie czysto systemowe przez wszystkim, za dużo skryptów w bashu w życiu. No ale niech napisze co potrzebuje, bo zwkle rozpoznanie czy to xml czy nie to file czemu nie?

`file /usr/portage/app-crypt/openvpn-blacklist/metadata.xml | awk '{print $2}'` == "XML\n"

i tyle.

Pytam z samej ciekawości i możliwości przydania się tego potem.
Post Arsena wiele tłumaczy, dzięki wszystkim.