Jak napisać REST API?

82

Piszę aplikację na iPhone'a jako projekt hobbystyczny i będzie potrzebować usługi internetowej, aby zapewnić jej dane. Nie różni się zbytnio od tego, co robię w pracy, ale w pracy piszę tylko widoki i kontrolery. Ktoś inny jest odpowiedzialny za napisanie modelu i zwykle to klienci zapewniają usługę sieciową.

Robiłem już trochę programowania internetowego, kiedy wszyscy używali MySQL i PHP, więc moje umiejętności są nieco przestarzałe, ale jestem przekonany, że byłbym w stanie to zrobić, używając technik, które już znam. Nie chcę jednak tracić czasu na używanie przestarzałych narzędzi. Doszedłem do wniosku, że najnowszym stanem techniki będzie napisanie REST API. Pomyślałem, że powinny istnieć całkiem dobre frameworki, które prawie dają ci REST API z funkcjonalnością CRUD, gdy tylko zdefiniujesz model.

Myślę, że moje pytanie brzmi: Jaki byłby najszybszy sposób na uruchomienie i uruchomienie REST API? Naprawdę chcę skupić się na pisaniu aplikacji na iPhone'a i nie spędzać zbyt wiele czasu na tym API. Byłoby wspaniale, gdybym mógł mieć również administrację internetową i historię zmian. Powinienem również dodać, że API nie powinno być publiczne, więc obsługa uwierzytelniania również byłaby świetna.

Żeby było jasne. Nie miałbym nic przeciwko frameworkowi PHP. W rzeczywistości mogłoby być lepiej, ponieważ wiem, że mój obecny hosting to obsługuje.

Erik B.
źródło
1
REST prawdopodobnie nie jest tym, czego naprawdę chcesz: medium.com/@trevorhreed/…
Trevor
2
Możesz użyć tego 66-liniowego skryptu PHP, który napisałem.
mevdschee
Odpowiedział 5 lat później 8-)
JustOnUnderMillions

Odpowiedzi:

42

EDYTOWAĆ:

Poniższe linki, które najwyraźniej były dobre przez 3 lata, już nie działają, więc poszedłem i znalazłem kilka nowych samouczków, które, jak sądzę, zostaną przez jakiś czas. Znajdują się one na stronie Ray Wenderlich, bardzo szanowanej witrynie z samouczkami dla programistów iOS. Pierwszy artykuł odnosi się do niedziałających linków poniżej, ale sam w sobie jest kompletny:

Jak napisać prostą usługę sieciową PHP / MySQL dla aplikacji na iOS

a druga ma trochę skrętu. Używał parse.com na zapleczu i AFNetworking. Oba są całkiem doskonałe.

Jak zsynchronizować podstawowe dane z usługą sieci Web - część 1


Naprawiłem zepsute linki poniżej, znajdując artykuły w drodze powrotnej maszyny. Ludziom podobają się linki, więc zatrzymam je. Powyższe linki powinny dać więcej do myślenia.


Robię dokładnie to samo z moją aplikacją na iPhone'a. Znalazłem ten artykuł na temat tworzenia RESTful API w PHP:

https://web.archive.org/web/20130910164802/http://www.gen-x-design.com/archives/create-a-rest-api-with-php/

a także artykuł uzupełniający:

https://web.archive.org/web/20130323001500/http://www.gen-x-design.com/archives/making-restful-requests-in-php/

z linkiem do kodu źródłowego na dole artykułu.

nickfox
źródło
2
Te linki wydają się teraz wygasać. Nie jestem pewien, czy dzieje się tak z kimkolwiek innym. : /
Augie Gardner
8

Zaprogramowałem REST API w ZEND Framework używając Zend_Rest_Controller, na iPhonie użyłem ASIHTTPRequest . Moje doświadczenia z obydwoma były dobre. Na początku miałem problemy ze skonfigurowaniem ZENDa i połączeniem go z mySQL, ale kiedy już zorientowałem się, jak to zrobić, byłem w stanie bardzo szybko napisać API. Jeśli masz dodatkowe pytania, mogę przekazać Ci więcej informacji.

EDYCJA: Wydaje się, że nie ma oficjalnej dokumentacji na temat Zend_Rest_Controller. Ten link opisuje, jak go używać do tworzenia interfejsu API. Musisz po prostu wyłączyć renderowanie w init()swojej podklasie i zaimplementować metody dla każdego wywołania REST.

Philipp
źródło
Nie widzę żadnego ZEND_Rest_Controller w witrynie Zend. Widzę ZEND_Rest_Server. Czy to ten, o którym mówisz?
Dmitri,
2
Zajrzyj tutaj, aby dowiedzieć się, jak korzystać z zend_rest_controller: techchorus.net/create-restful-applications-using-zend-framework. Tworzenie interfejsu API odpoczynku jest łatwe w przypadku tej klasy
Filip
Wydaje się, że jest to mniej więcej dokładnie to, czego potrzebuję. Wypróbuję to i jeśli mi się uda, przyjmuję to jako moją odpowiedź. Dzięki.
Erik B
4
Chyba nie udało mu się ...: D
user151841
8

Dla Twojej wiadomości:

Skończyło się na Ruby on Rails.

EDYCJA: Ponieważ ta odpowiedź została odrzucona, ponieważ nie podała powodu wyboru Ruby on Rails, a także nie ma instrukcji, jak napisać REST API za jego pomocą, pomyślałem, że dam ci moją motywację i kilka prostych instrukcji.

Zacząłem czytać książkę o Ruby on Rails i zdałem sobie sprawę, że wszystko, co muszę zrobić, to użyć rusztowania i otrzymałem za darmo JSON REST API.

Oto dobry przewodnik na początek: http://guides.rubyonrails.org/getting_started.html

Kiedy masz uruchomione i uruchomione środowisko Ruby on Rails, utworzenie REST API nie jest trudniejsze niż uruchomienie:

$ rails generate scaffold Post name:string title:string content:text

(Przykład z powyższego linku.) Zauważyłem również, że Railsy są bardzo łatwe i darmowe do wdrożenia na heroku , co oznaczało, że nie musiałem płacić za hosting dla mojego bardzo podstawowego, niskiego ruchu, REST API. Jest wiele innych powodów, dla których bardzo się cieszę ze współpracy z Ruby on Rails, ale to wykracza poza kontekst tego pytania.

Erik B.
źródło
10
dając sobie odpowiedź, a następnie zaznaczając ją znacznikiem wyboru zły człowiek BARDZO zła forma.
thenetimp
29
@thenetimp Nie ma nic złego w odpowiadaniu na własne pytanie. W rzeczywistości jest to zalecane, o ile jest to poprawna odpowiedź i nie została udzielona przez nikogo innego. Nie zyskujesz reputacji za zaakceptowanie własnej odpowiedzi, więc naprawdę nie rozumiem, co możesz mieć przeciwko temu.
Erik B
3
byłoby lepiej, gdybyś podał swoje uzasadnienie wyboru
mustafa
4
@Nate Poleciłbym Ruby on Rails każdemu, kto chce napisać REST API, więc nie będę usuwał swojej odpowiedzi. Przeczytałem jednak Twoją opinię i zaktualizowałem swoją odpowiedź. Mam nadzieję, że ci się to podoba.
Erik B
2
@ DennisKrøger, jeśli pytanie brzmi „Jak napisać REST API?” wtedy „Użyłem RoR. Oto przewodnik, jak rozpocząć korzystanie z ich rusztowań” jest całkowicie właściwą odpowiedzią.
Mattygabe
8

Postępowałem zgodnie z dość prostym samouczkiem dotyczącym tworzenia interfejsów API RESTful w PHP:

Corey Maynard - Tworzenie RESTful API w PHP

Główna koncepcja obejmuje:

  • jedna abstrakcyjna klasa, która obsługuje analizę identyfikatora URI i zwraca odpowiedź, i
  • jedna konkretna klasa, która składa się tylko z punktów końcowych interfejsu API.
jim_kastrin
źródło
3

A co z Pythonem?

Używałbym Pythona, Django i Pistona.

  1. Generowałbym modele Django z istniejącej bazy danych za pomocą inspectdb .
  2. Dodaj administratora Django do swoich modeli.
  3. Dodaj Django Piston do swojej aplikacji.
  4. Zysk.

Bez doświadczenia z Pythonem lub Django, prawdopodobnie zajmie ci dzień opracowanie tego rozwiązania, a cały kod jest testowany jednostkowo i działa .

igorgue
źródło
1

Sprawdź następującą klasę PHP, która jest zgodna z MVC. http://www.phpclasses.org/package/5080-PHP-Implement-REST-Web-services-servers.html

Mam nadzieję że to pomoże.

shauvik
źródło
7
Zdecydowanie odradzam używanie czegokolwiek z phpclasses.org. Wiele zajęć w tej witrynie jest nieprzetestowanych, niezabezpieczonych, napisanych przez skrypciarzy. Poszukaj bardziej renomowanego miejsca, jak PEAR lub Zend
Dmitri
13
Ponad 3000 programistów PHP przesłało pakiety do witryny PHPClasses. Niektórzy są znacznie bardziej zdolni niż inni. Wielu jest nawet współtwórcami PEAR i Zend. Mówienie ludziom, aby nie korzystali z pakietu rozpowszechnianego w tej witrynie tylko dlatego, że znalazłeś pakiety, które Twoim zdaniem są niesprawdzone i niebezpieczne, jest czystym uprzedzeniem. Pakiet polecany przez @src jest pakietem najlepiej ocenianym. Byłoby mądrzejsze, gdybyś spojrzał na kod pakietu lub przynajmniej oceny użytkowników, zanim zdecydowałeś się uogólnić na wszystko tylko dlatego, że jest on rozpowszechniany w witrynie.
mlemos
0

Jeśli znasz już PHP, nie ma nic złego w zapleczu PHP / MySQL. Możesz wysłać wszystkie odpowiedzi w formacie plist xml kompatybilnym z iPhonem i natychmiast przekształcić je w strukturę danych NSDictionary / NSArray / NSNumber za pomocą tego krótkiego fragmentu kodu:

NSString *response = [request responseString];
NSData* plistData = [response dataUsingEncoding:NSUTF8StringEncoding];
NSPropertyListFormat format;
NSString *errorStr;
NSDictionary* plist = [NSPropertyListSerialization propertyListFromData:plistData 
                                                       mutabilityOption:NSPropertyListImmutable 
                                                                 format:&format 
                                                       errorDescription:&errorStr];

Korzystam również z pakietu ASIHTTP do tworzenia adresów URL, wysyłania asynchronicznych zapytań i otrzymywania odpowiedzi, gorąco polecam:

http://allseeing-i.com/ASIHTTPRequest/

Bogatyr
źródło
0

W usłudze sieciowej należy używać dowolnych języków, w których czujesz się swobodnie. Każdy język, w którym można formułować odpowiedzi REST na żądania, jest w porządku.

To powiedziawszy, jeśli chcesz, aby coś działało szybko, sugeruję użycie Pythona w Google App Engine. To nic nie kosztuje i jeśli chcesz, możesz używać Javy zamiast Pythona. App Engine obsługuje uwierzytelnianie za pomocą OpenID i / lub kont Google (nie wiadomo, czy wykluczają się wzajemnie), więc powinno to ułatwić kodowanie.

Jeśli chodzi o wysyłanie żądań na urządzenie iOS, sugeruję użycie ASIHTTPRequest .

Mosze
źródło
0

Inną opcją jest restSQL, ultralekka struktura trwałości. Zobacz http://restsql.org . Obsługuje MySQL i PostgreSQL i działa w standardowym kontenerze Java EE, np. Apache Tomcat.

restSQL to bardzo niekonwencjonalna warstwa dostępu do danych. restSQL nie jest zorientowanym obiektowo widokiem bazy danych. Przedstawia płaskie lub hierarchiczne „widoki” tabel relacyjnych baz danych. Te widoki są obsługiwane za pomocą zapytań i aktualizowane za pomocą prostego interfejsu API HTTP lub Java opartego na REST. Interfejs HTTP jest oparty na zasadach REST, które wykorzystują wbudowane funkcje HTTP, a nie odbiegają od nich.

Potrzebujesz „REST API z funkcjonalnością CRUD” i to jest właśnie najlepsze rozwiązanie restSQL. Możesz to zrobić bez kodu. Po prostu zdefiniuj zasoby SQL za pomocą plików XML i zacznij wykonywać na nich wywołania HTTP z pełną funkcjonalnością CRUD.

Mark Sawers
źródło