Как написать REST API?

82

Я пишу приложение для iPhone в качестве хобби, и ему понадобится веб-сервис для предоставления данных. Это не сильно отличается от того, что я делаю на работе, но на работе я пишу только представления и контроллеры. Кто-то другой отвечает за написание модели, и обычно клиенты предоставляют веб-сервис.

Я занимался веб-программированием и раньше, когда все использовали MySQL и PHP, поэтому мои навыки немного устарели, но я уверен, что смогу использовать уже известные мне техники. Однако я не хочу тратить свое время на устаревшие инструменты. Я сообразил, что самое современное - написать REST API. Я думал, что должны быть довольно хорошие фреймворки, которые в значительной степени просто предоставляют вам REST API с функциональностью CRUD, как только вы определили модель.

Думаю, у меня такой вопрос: как можно быстрее всего запустить REST API? Я просто хочу сосредоточиться на написании приложения для iPhone и не тратить слишком много времени на этот API. Было бы здорово, если бы я мог получить веб-администрирование и историю изменений. Я также должен добавить, что API не должен быть общедоступным, поэтому поддержка аутентификации также будет отличной.

Просто быть чистым. Я бы не возражал против PHP-фреймворка. На самом деле это могло быть лучше, так как я знаю, что мой текущий хостинг поддерживает это.

Эрик Б.
источник
1
ОТДЫХ, вероятно, не то, что вы действительно хотите: medium.com/@trevorhreed/…
Тревор
2
Вы можете использовать этот 66-строчный PHP-скрипт, который я написал.
mevdschee 07
Ответ
дан

Ответы:

42

РЕДАКТИРОВАТЬ:

Ссылки ниже, которые, по-видимому, были хорошими в течение 3 лет, больше не работают, поэтому я пошел и нашел пару новых руководств, которые, как мне кажется, останутся на некоторое время. Они находятся на сайте Рэя Вендерлиха, очень уважаемого учебного сайта для разработчиков iOS. Первая статья на самом деле ссылается на неработающие ссылки ниже, но сама по себе полная:

Как написать простой веб-сервис PHP / MySQL для приложения iOS

а у второго есть небольшая изюминка. Он использовал parse.com на сервере и AFNetworking. Оба из них довольно хороши.

Как синхронизировать основные данные с веб-службой - часть 1


Я исправил неработающие ссылки ниже, найдя статьи на обратном пути. Людям нравятся ссылки, поэтому я буду их хранить. Ссылки выше должны дать больше пищи для размышлений.


Я делаю то же самое со своим приложением для iphone. Я нашел эту статью о создании RESTful API на PHP:

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

Здесь также есть дополнительная статья:

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

со ссылкой на исходный код внизу статьи.

Nickfox
источник
2
Кажется, что эти ссылки истекли. Я не уверен, происходит ли это с кем-то еще. : /
Оги Гарднер
8

Я запрограммировал REST API в ZEND Framework с помощью Zend_Rest_Controller, на iPhone я использовал ASIHTTPRequest . Мой опыт работы с обоими хорошими. Сначала у меня были проблемы с настройкой ZEND и подключением его к mySQL, но как только я понял, как это сделать, я смог очень быстро написать API. Я могу поделиться с вами дополнительной информацией, если у вас возникнут дополнительные вопросы.

РЕДАКТИРОВАТЬ: похоже, нет официальной документации Zend_Rest_Controller. Эта ссылка описывает, как использовать его для создания вашего API. Вам просто нужно отключить рендеринг в init()своем подклассе и реализовать методы для каждого вызова REST.

Филипп
источник
Я не вижу ZEND_Rest_Controller на сайте Zend. Я вижу ZEND_Rest_Server. Ты об этом говоришь?
Дмитрий
2
Посмотрите здесь, чтобы получить хорошее начало о том, как использовать zend_rest_controller: techchorus.net/create-restful-applications-using-zend-framework. Создание api для отдыха с этим классом не требует усилий
Филипп
Кажется, это более или менее именно то, что мне нужно. Я попробую, и если мне это удастся, я приму это как свой ответ. Благодарю.
Erik B
4
Я думаю, у него не получилось ...: D
user151841 09
8

Просто чтобы вы знали:

В итоге я использовал Ruby on Rails.

РЕДАКТИРОВАТЬ: Поскольку этот ответ был отвергнут из-за того, что он не указывал причину выбора Ruby on Rails, а также не указывал, как написать с ним REST API, я подумал, что дам вам свою мотивацию и несколько простых инструкций.

Я начал читать книгу о Ruby on Rails и понял, что все, что мне нужно сделать, это использовать скаффолдинг, и я получил JSON REST API бесплатно.

Вот хорошее руководство для начала: http://guides.rubyonrails.org/getting_started.html

Когда ваша среда Ruby on Rails запущена и работает, создать REST API не сложнее, чем запустить:

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

(Пример из приведенной выше ссылки.) Я также обнаружил, что Rails очень легко и бесплатно развернуть на heroku , а это значит, что мне не нужно было платить за хостинг для моего базового REST API с низким трафиком. Есть много других причин, по которым я очень рад работать с Ruby on Rails, но это выходит за рамки этого вопроса.

Эрик Б.
источник
10
давая себе ответ, а затем ставя его галочкой, дурной тон, человек ОЧЕНЬ дурной тон.
thenetimp 01
29
@thenetimp Нет ничего плохого в том, чтобы ответить на свой вопрос. На самом деле это поощряется, если это правильный ответ, и никто его не дал. Вы не получаете репутации, если принимаете свой ответ, поэтому я действительно не понимаю, что вы можете иметь против него.
Erik B
3
было бы лучше, если бы вы привели свои аргументы в пользу его выбора
mustafa
4
@Nate Я бы порекомендовал Ruby on Rails всем, кто хочет написать REST API, поэтому я не буду удалять свой ответ. Однако я прочитал ваш отзыв и обновил свой ответ. Надеюсь, тебе это понравится.
Erik B
2
@ DennisKrøger, если возникает вопрос "Как написать REST api?" тогда «Я использовал RoR. Вот руководство, чтобы начать работу с их лесами» - вполне правильный ответ.
Mattygabe
8

Я последовал довольно простому руководству по созданию RESTful API с помощью PHP:

Кори Мейнард - Создание RESTful API с помощью PHP

Основная концепция включает:

  • один абстрактный класс, который обрабатывает синтаксический анализ URI и возвращает ответ, и
  • один конкретный класс, состоящий только из конечных точек для API.
jim_kastrin
источник
3

А как насчет Python?

Я бы использовал Python, Django и Piston.

  1. Я бы сгенерировал модели Django из вашей существующей БД с помощью inspectdb .
  2. Добавьте в свои модели администратора Django .
  3. Добавьте Django Piston в свое приложение.
  4. Прибыль.

Без опыта работы с Python или Django, вероятно, вам понадобится день, чтобы разработать это решение, а весь код протестирован и работает .

игорг
источник
1

Ознакомьтесь со следующим классом PHP, который следует за MVC. http://www.phpclasses.org/package/5080-PHP-Implement-REST-Web-services-servers.html

Надеюсь это поможет.

шаувик
источник
7
Я категорически не рекомендую использовать что-либо с phpclasses.org. Многие классы на этом сайте непроверены, небезопасны, написаны скрипичными детишками. Поищите где-нибудь более авторитетное, например PEAR или Zend
Дмитрий
13
Более 3000 разработчиков PHP отправили пакеты на сайт PHPClasses. Некоторые из них намного более способны, чем другие. Многие из них даже являются участниками PEAR и Zend. Сказать людям не использовать пакет, распространяемый на этом сайте, только потому, что вы обнаружили некоторые пакеты, которые, по вашему мнению, не проверены и небезопасны, является чистым предубеждением. Пакет, рекомендованный @src, является пакетом с самым высоким рейтингом. Было бы разумнее, если бы вы посмотрели на код пакета или, по крайней мере, на рейтинги пользователей, прежде чем вы решили делать обобщения против всего, только потому, что это распространяется на сайте.
mlemos
0

Если вы уже знаете PHP, нет ничего плохого в бэкэнде PHP / MySQL. Вы можете отправлять все ответы в формате XML-файла plist, совместимого с iPhone, и мгновенно преобразовывать ответ в структуру данных NSDictionary / NSArray / NSNumber с помощью этого короткого фрагмента кода:

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

Я также использую пакет ASIHTTP для формирования URL-адресов, отправки асинхронных запросов и получения ответов, я очень рекомендую его:

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

Богатырь
источник
0

Для веб-службы вы должны использовать те языки, которые вам удобны. Подойдет любой язык, который может формулировать ответы REST на запросы.

Тем не менее, если вы хотите, чтобы что-то работало быстро, я предлагаю использовать Python в Google App Engine. Это бесплатно, и вы можете использовать Java вместо Python, если хотите. App Engine поддерживает аутентификацию с использованием OpenID и / или учетных записей Google (не уверен, что они исключают друг друга), так что это должно упростить кодирование.

Что касается выполнения запросов на устройстве iOS, я предлагаю использовать ASIHTTPRequest .

Моше
источник
0

Другой вариант - restSQL, сверхлегкий фреймворк персистентности. См. Http://restsql.org . Он поддерживает MySQL и PostgreSQL и работает в стандартном контейнере Java EE, например Apache Tomcat.

restSQL - очень нетрадиционный уровень доступа к данным. restSQL не является объектно-ориентированным представлением базы данных. Он представляет плоские или иерархические «представления» таблиц реляционной базы данных. Эти представления можно запрашивать и обновлять через простой HTTP или Java API на основе REST. Интерфейс HTTP основан на принципах REST, которые используют встроенные функции HTTP, а не абстрагируются от них.

Вам нужен REST API с функциональностью CRUD, и это как раз то, что нужно для restSQL. Вы можете сделать это без кода. Просто определите свои ресурсы SQL через файлы XML и начните выполнять для них HTTP-вызовы с полной поддержкой CRUD.

Марк Соерс
источник