Api - jak się do tego zabrać - dyskusje i zasoby

Hej,
jako że wygląda na to że będę trochę siedział w API, szukam informacji, jak do tego podejść. Ktoś ma do polecenia jakieś artykuły, video, własne doświadczenia?
Poniżej prezentacja drogusa o dekoratorach:

http://json-on-rails-wrug.heroku.com/

Jest rails-api,

Sporo api roznych ostatnio pisalem i preferuje sinatre, (goliath + grape), to sie tez przydac moze http://railscasts.com/episodes/350-rest-api-versioning

na HN ostatnio znalazłem, może się przyda: http://info.apigee.com/Portals/62317/docs/web%20api.pdf

http://www.confreaks.com/videos/986-goruco2012-from-zero-to-api-cache-w-grape-mongodb-in-10-minutes

Przy tworzeniu api w Railsach wykorzystałbym https://github.com/apotonick/roar-rails, który pozwala zdefiniować co konkretnie mamy przesyłać np. jsonem. Unikałbym rozwiązań w stylu jbuilder (jest wolne). Nie używałbym również gemu representable - można go używać tylko z ActiveRecord (domyślnie).

Do testowania api możesz używać curla, albo np. gem api_taster.

Jeśli planujesz używać devise to na pewno nie korzystaj z Basic Auth. Mamy na Heroku aplikację, gdzie Basic Auth (ze standardowo skonfigurowanym bcryptem) zajmuje około 70-80% czasu zapytania do serwera.

Ja teraz bym użył do API active model serializers, tylko w czsasie robienia tej prezentacji ten gem był w bardzo wczesnej fazie.

@filiptepper: sprawdzaliście co tak długo zajmuje? Nie używam teraz nigdzie devise, ale to dziwnie wygląda…

Używam tego gemu, bardzo sobie chwalę.

BCrypt. Czego się w normalnej aplikacji nie czuje, bo weryfikacja nazwy użytkownika i hasła odbywa się tylko raz.

Ja używam RocketPants + rabl

Ach, myślałem, że chodzi o samo devise - co byłoby dziwne. Też używam bcrypta, będę musiał sprawdzić. Do API fajnie działa to co mają w githubie, tzn. uproszczony OAuth - wysyłasz POST /authentications i później tak stworzonym kluczem można się logować.

Co do bcrypta jeszcze, to kiedyś rozważałem mielenie tego na poziomie bazy: http://www.postgresql.org/docs/current/static/pgcrypto.html, może dałoby radę uciąć trochę ten czas.

Btw. jaki content type dla requestów preferujecie? application/x-www-form-urlencoded czy application/json?

Ja używam:

content_type ‘application/json; charset=utf-8’

+1 dla application/json

Wszystko zależy od tego jak będzie uzyskiwany dostęp do api. Oczywiście application/json jest chyba najbardziej prawidłowe, ale czasami są sytuacje nie do przeskoczenia (klientowi się nie wytłumaczy) i trzeba być przygotowany również na wykorzystywanie application/x-www-form-urlencoded.

Ale jak robisz api od zera to application/json.

Nie wiem tylko, na ile to pomoże - bcrypt w Rubym i tak jest w już rozszerzeniem w C, chyba aż tak dużej różnicy nie będzie?

Nie używam jakoś szczególnie dużo bcrypta w rubim, ale z tego co widzę ( https://github.com/codahale/bcrypt-ruby ) to ma możliwość zmiany cost factor (a nawet kalibracji pod konkretny sprzęt- calibrate(upper_time_limit_in_ms) ).
Bcrypt powinien być wolny, ale Aaron w readme pisze o potrzebie zmiany cost factor w niektórych przypadkach, próbowaliście?

Nieco z innej beczki. Czego używacie do testowania API?
Czy są jakieś narzędzia, które z testów potrafią wygenrować sensowną dokumentację?

Ja używam rspec + https://github.com/collectiveidea/json_spec testy są integracyjne, czyli uderzają po bazie i używają rzeczywistych modeli. Niestety nie jestem jakoś super zadowolony z tego rozwiązania. Testy ciężko się utrzymuje, wolno działają i wygenerowania z nich dokumentacja nie jest jakoś specjalnie przydatna.

Hmm a dlaczego używacie do tego bcrypt zamiast md5/sha1?

Bcrypt jest domyślny w Devise, nie trzyma soli w osobnym polu i nie jest bruteforce’owalny w tak krótkim czasie jak sha1 czy, nie daj boże, md5.

md5 wyoutowane, sha1 na wylocie http://valerieaurora.org/hash.html