piątek, lutego 05, 2010

Ha! Ochidna Echidna potrafi updatować pliki :-)

Tak od paru dni nic nie kodowałem, ale w końcu dziś zmusiłem się do tego by przyjrzeć się znów projektowi mającemu na celu uczynienie z Google Docs dysku R:\ w Windows ;-)
Przerzuciłem projekt z wersji 4.0 .NET to wersji 3.5 bo nie używam żadnych ficzerów z 4.0, dodatkowo przerzuciłem wszystko do MonoDevelop, takiego aspiranta do bycia .NETowym Eclipsem ;-) jeden plus, że wygodniejszy od Visual C# Express 2010, choć taką nowomodną funkcjonalność jak pokazywanie lokalnych zmiennych w trakcie debugowania to by mu mogli dodać ;-)

No i dziś dzięki temu wszystkiemu udało mi się w końcu zupdatować dokument w Google Docs :-) Jest to o tyle osiągnięcie, że biblioteki .NET dla wersji 2.0 Google Docs API nie potrafią updatować plików, trzeba więc zrobić to samemu :-) ale jakieś szczególnie trudne to nie jest.
Google mówi, że do updatowania trzeba zbudować takiego requesta:
PUT /feeds/media/private/full/document%3Adocument_id
Host: docs.google.com
Authorization: <your authorization header here>
Content-Length: 70581
Content-Type: application/msword
Slug: test.doc

... doc contents here ...

Oczywiście w miejscu content lenghta podajemy długość naszego pliku ;-) Praktyka pokazuje, że użycie czegoś takiego powoduje wyrzucenie przez serwer Google Docs błędu 400 z komunikatem "Missing Resource Version ID", dlatego trzeba dodać do nagłówków naszego requesta nagłówek GData-Version, w moim przypadku "GData-Version: 2.0", który mówi serwerowi jakiej wersji API używamy. To oczywiście nadal nie działa, bo serwer Google Docs zwraca błąd, tym razem już w XMLu o treści "If-Match or If-None-Match header required". Czyli trzeba dodać kolejny nagłówek do requesta tym razem albo "If-Match" albo "If-None-Match", nie do końca rozumiem rozróżnienia dlatego użyłem "If-Match", jako jego wartość podajemy ETag związany z dokumentem, a ten ETag już znałem.
Ostatecznie request wygląda tak:
PUT /feeds/media/private/full/document%3Adocument_id
Host: docs.google.com
Authorization: <your authorization header here>
User-Agent: rmk-Short_beaked_Echidna-0.0.2
Content-Type: application/msword
Slug: przemelkowyTest2.doc
GData-Version: 2.0
If-Match: "XEdaTR9ABSp7ImBr"
Content-Length: 16896

... doc contents here ...

Tu od razu uwaga, jak chcesz gadać z jakimś serwerem którego nie kontrolujesz to używaj Fiddlera, bo dzięki temu o wiele łatwiej śledzić co się wysyła i co się dostaje. Próbowałem używać Whiresharka, ale się uparł i nie widzi połączenia bazującego na moim modemie do Blueconnecta.. gupek ;-)

Oczywiście multum ci innych problemów [a może multum Ci innych problemów? to ci to Ci czyli forma od Ty, czy może ci to oni, albo jeszcze jakieś inne znaczenie?], np. do teraz wszystkie dokumenty otwierane z dysku R:\ otwierają się w OpenOffice.org w trybie tylko do odczytu, coś pewnie trzeba pomącić z tym kretyńskim C# wynalazkiem out czyli zwracaniem przez parametr [OK, to nie jest tak naprawdę wynalazek C#, praktycznie każdy język to wspiera, prócz Java'y za co należy ją cenić bo to o wiele ułatwia analizę kodu] którym pewnie coś powinienem zwrócić.

Wychodzi też na to, że uploadowanie dokumentów będę musiał sam sobie zaimplementować i zignorować to które jest w bibliotekach Google Docs, a to dlatego, że .NETowa biblioteka uparcie ignoruje rozszerzenie w nazwie dokumentu :-( choć to się jeszcze okaże.
Trzeba będzie też kiedyś dodać kasowanie i może foldery, ale nie wiem na 100%.
Nadal też przeraża mnie lekko partyzanckie podejście do tego dysku, bo docelowo prawdopodobnie będę musiał ten dysk R:\ traktować w taki sposób, że dokumenty rozpoznawalne przez Google Docs będą przechowywane w Google Docs, a wszystkie inne pliki będą trzymane w jakimś "RAM dysku" co jest głupie, ale może się okazać jedynym rozwiązaniem.

Ważne, że się udało zrobić dziś update :-)


Podobne postybeta
Wysyłamy pliki do Google Docs przy pomocy Go :-)
"Ochidna" Echidna ;-) czyli jak się mają prace nad RDrive.
Toperz ;-) czyli OCR + Android odsłona 2 albo któraś tam
Wredne Google Docs
Chrome OS, Chrome2Chrome i w ogóle Chrome ;-)