как написать api rest?

<p>я пишу приложение для iphone в качестве хобби-проекта, и ему понадобится веб-сервис для предоставления данных. это не сильно отличается от того, что я делаю на работе, но на работе я пишу только представления и контроллеры. кто-то другой отвечает за написание модели, и обычно клиенты предоставляют веб-сервис.</p><p>я занимался веб-программированием раньше, еще тогда, когда все использовали mysql и php, поэтому мои навыки немного устарели, но я уверен, что смогу использовать их, используя методы, которые я уже знаю. однако я не хочу тратить свое время на использование устаревших инструментов. я понял, что в настоящее время можно написать api rest. я думал, что должны быть некоторые довольно хорошие фреймворки, которые в значительной степени просто предоставляют вам rest api с функциональностью crud, как только вы определили модель.</p><p>наверное, мой вопрос: какой самый быстрый способ получить и запустить rest api? я действительно хочу сосредоточиться на написании приложения для iphone и не тратить слишком много времени на этот api. было бы замечательно, если бы я мог получить веб-администрирование и историю изменений тоже. я также должен добавить, что api не должен быть общедоступным, поэтому поддержка аутентификации также будет отличной.</p><p>просто быть чистым. я не возражаю против php фреймворка. на самом деле это может быть лучше, так как я знаю, что мой текущий хостинг поддерживает это.</p>

<p>просто чтобы вы знали:</p><p>в конечном итоге я использовал ruby в rails.</p><p><strong> редактировать: </strong> поскольку этот ответ был отклонен из-за того, что он не указал причину выбора ruby для rails, а также нет инструкций по написанию api rest, я подумал, что дам вам мотивацию и несколько простых инструкций.</p><p>я начал читать книгу о ruby на rails и понял, что все, что мне нужно было сделать, - это использовать строительные леса, и я получил json rest api бесплатно.</p><p>вот хорошее руководство по началу работы: <a href="http://guides.rubyonrails.org/getting\_started.html">http://guides.rubyonrails.org/getting\_started.html</a> </p><p>когда ваша среда ruby on rails запущена и работает, создание api rest не сложнее, чем запуск:</p><pre><code>$ rails generate scaffold post name:string title:string content:text </code></pre><p>(пример из приведенной выше ссылки.) я также обнаружил, что rails очень легко и свободно развернуть на <a href="https://www.heroku.com/">herok</a> , что означало, что мне не пришлось платить за хостинг для моего очень простой, с низким трафиком, rest api. есть много других причин, почему я очень рад работать с ruby на rails, но это выходит за рамки этого вопроса.</p>

<p><strong> edit: </strong></p><p>ссылки ниже, которые, по-видимому, были хорошими в течение 3 лет, больше не работают, поэтому я пошел и нашел пару новых учебников, которые, я думаю, будут на некоторое время задерживаться. они находятся на сайте ray wenderlich, очень уважаемом учебном сайте ios dev. первая статья на самом деле ссылается на неработающие ссылки ниже, но она завершена сама по себе:</p><p> <a href="http://www.raywenderlich.com/2941/how-to-write-a-simple-phpmysql-web-service-for-an-ios-app">как написать простой веб-сервис php/mysql для приложения для ios</a> </p><p>и второй имеет небольшой поворот к этому. он использовал parse.com на сервере и afnetworking. оба из которых довольно отлично.</p><p> <a href="http://www.raywenderlich.com/15916/how-to-synchronize-core-data-with-a-web-service-part-1">как синхронизировать основные данные с веб-сервисом - часть 1</a> </p><hr><p>я исправил неработающие ссылки ниже, найдя статьи на обратном пути машины. людям, похоже, нравятся ссылки, поэтому я их оставлю. ссылки выше должны предоставить больше пищи для размышлений.</p><hr><p>я делаю то же самое с моим приложением для iphone. я нашел эту статью о создании restful api в php:</p><p> <a href="https://web.archive.org/web/20130910164802/http://www.gen-x-design.com/archives/create-a-rest-api-with-php/">https://web.archive.org/web/20130910164802/http://www.gen-x-design.com/archives/create-a-rest-api-with-php/</a> </p><p>и здесь также есть продолжение статьи:</p><p> <a href="https://web.archive.org/web/20130323001500/http://www.gen-x-design.com/archives/making-restful-requests-in-php/">https://web.archive.org/web/20130323001500/http://www.gen-x-design.com/archives/making-restful-requests-in-php/</a> </p><p>со ссылкой на исходный код внизу статьи.</p>

<p>я следовал довольно простому руководству по созданию restful api с помощью php:</p><p> <a href="http://coreymaynard.com/blog/creating-a-restful-api-with-php/api/v1/example">кори мейнард - создание restful api с помощью php</a> </p><p>основная концепция включает в себя:</p><ul> <li>один абстрактный класс, который обрабатывает разбор uri и возвращает ответ, и</li> <li>один конкретный класс, который состоит только из конечных точек для api.</li> </ul>

<p>я запрограммировал api rest в <a href="http://framework.zend.com/">zend framework</a> с помощью zend\_rest\_controller на iphone, который я использовал <a href="http://allseeing-i.com/asihttprequest/">asihttprequest</a> . мой опыт с обоими, где хорошо. вначале у меня были некоторые проблемы с настройкой zend и подключением его к mysql, но как только я понял, как это сделать, я смог написать api очень быстро. я могу поделиться с вами дополнительной информацией, если у вас возникнут дополнительные вопросы.</p><p>правка: кажется, нет официальной документации по <code>zend\_rest\_controller</code>. <a href="http://techchorus.net/create-restful-applications-using-zend-framework">эта ссылка</a> описывает, как использовать его для создания вашего api. вам просто нужно отключить рендеринг в <code>init()</code> вашего подкласса и реализовать методы для каждого вызова rest.</p>

<p>а как насчет python?</p><p>я бы использовал python, django и piston.</p><ol> <li>я бы сгенерировал модели django из вашей существующей бд, используя <a href="http://docs.djangoproject.com/en/dev/howto/legacy-databases/#auto-generate-the-models">inspectdb</a> .</li> <li>добавьте <a href="http://docs.djangoproject.com/en/1.2/ref/contrib/admin/">django admin</a> к своим моделям.</li> <li>добавьте <a href="https://bitbucket.org/jespern/django-piston/wiki/home">django piston</a> в свое приложение.</li> <li>прибыль.</li> </ol><p>без опыта работы с python или django, вероятно, вам понадобится день, чтобы разработать это решение, и весь код будет проверен модулем и <a href="http://urbanairship.com/">доказано, что он работает</a> .</p>

<p>если вы хотите использовать php, я рекомендую использовать среду codeigniter с сервером rest фила стерджена:</p><p> <a href="http://net.tutsplus.com/tutorials/php/working-with-restful-services-in-codeigniter-2">http://net.tutsplus.com/tutorials/php/working-with-restful-services-in-codeigniter-2</a> </p><p> <a href="https://github.com/philsturgeon/codeigniter-restserver">https://github.com/philsturgeon/codeigniter-restserver</a> </p>

<p>извлеките следующий класс php, следующий за mvc. <a href="http://www.phpclasses.org/package/5080-php-implement-rest-web-services-servers.html">http://www.phpclasses.org/package/5080-php-implement-rest-web-services-servers.html</a> </p><p>надеюсь это поможет.</p>

<p>другим вариантом является restsql, сверхлегкий каркас персистентности. смотрите <a href="http://restsql.org">http://restsql.org</a> . он поддерживает mysql и postgresql и работает в стандартном контейнере java ee, например, apache tomcat.</p><p>restsql - очень нестандартный уровень доступа к данным. restsql не является объектно-ориентированным представлением базы данных. он представляет плоские или иерархические "представления" таблиц реляционных баз данных эти представления могут запрашиваться и обновляться через простой http-интерфейс на основе rest или api-интерфейс java. http-интерфейс основан на принципах rest, которые используют встроенные функции http, а не абстрагируются от них.</p><p>вам нужен "rest api с функциональностью crud", и это именно то, что нужно для restsql. вы можете сделать это без кода. просто определите свои ресурсы sql с помощью файлов xml и начните выполнять http-вызовы против них с полной возможностью crud.</p>

<p>вы должны использовать любые языки, которые вам нравятся, для веб-сервиса. подойдет любой язык, который может формулировать rest ответы на запросы.</p><p>тем не менее, если вы хотите быстро запустить что-то, я предлагаю использовать python в google app engine. это бесплатно, и вы можете использовать java вместо python, если хотите. app engine поддерживает аутентификацию с использованием openid и/или учетных записей google (не уверен, что они взаимоисключающие), так что это облегчит кодирование.</p><p>что касается выполнения запросов на устройстве ios, я предлагаю использовать <a href="http://allseeing-i.com/asihttprequest/">asihttprequest</a> .</p>

<p>если вы уже знаете php, нет ничего плохого в бэкэнде php/mysql. вы можете отправить все ответы в xml-формате, совместимом с iphone, и мгновенно превратить ответ в структуру данных nsdictionary/nsarray/nsnumber с помощью этого короткого фрагмента кода:</p><pre><code>nsstring *response = [request responsestring]; nsdata* plistdata = [response datausingencoding:nsutf8stringencoding]; nspropertylistformat format; nsstring *errorstr; nsdictionary* plist = [nspropertylistserialization propertylistfromdata:plistdata mutabilityoption:nspropertylistimmutable format:&format errordescription:&errorstr]; </code></pre><p>я также использую пакет asihttp для формирования url-адресов, отправки асинхронных запросов и получения ответов, я настоятельно рекомендую его:</p><p> <a href="http://allseeing-i.com/asihttprequest/">http://allseeing-i.com/asihttprequest/</a> </p>