Работа с пятнистой (мобильной) связью и API - PullRequest
1 голос
/ 10 февраля 2012

В настоящее время я создаю API, доступ к которому через мобильное приложение осуществляется через HTTP.Предположим, что следующий сценарий: мобильное приложение отправляет запрос HTTP POST на www.example.com/customers, содержащий регистрационные данные, API подключается к базе данных, вставляет новую запись и возвращает 200 OK плюс некоторые специфические для пользователя регистрационные данные.

Теперь предположим, что вставка в базу данных прошла нормально, но ответ 200 OK никогда не передавался в мобильное приложение, плохое соединение / пользователь отключил мобильное соединение и т. Д. Очевидно, что повторение того же запроса POST не будет работать, потому чтопользователь с таким именем / идентификатором уже присутствует.Как бы я решил эту проблему (и защитил бы другие функции в API, используя тот же механизм)?

Кроме того, когда я размышлял над приведенным выше сценарием, может ли возникнуть такая же проблема между веб-сервером и сервером базы данных?Например: PHP-скрипты вызывают mysql_connect () для подключения к (удаленной) базе данных, и выполняется вызов mysql_query ().Может ли случиться так, что сервер базы данных совершил запрос, но по какой-то причине PHP-скрипт никогда не получал «OK» от соединения с БД из-за плохого соединения или чего-то подобного?

Ответы [ 2 ]

1 голос
/ 10 февраля 2012

Возможно, вы можете использовать идентификатор транзакции для каждого запроса, чтобы убедиться, что фактический запрос был выполнен.

Позвольте мне уточнить; Для каждого запроса, сделанного мобильным приложением, вы назначаете идентификатор транзакции для сделанного запроса. Сервер выполняет действие, сохраняет транзакцию как завершенную и возвращает сообщение, подобное: {"результат": 200, "транзакция": 1234123}.

Если клиент не получает сообщение об успешном завершении (из-за проблем с сетью), он повторно передает запрос с тем же идентификатором транзакции. Когда сервер получит сообщение, он узнает, что транзакция уже завершена, и ответит клиенту соответствующим образом.

Вероятно, вы должны использовать UUID для идентификаторов транзакций, чтобы обеспечить уникальность.

0 голосов
/ 10 февраля 2012

Сохраняйте переменные сеанса, которые вы можете использовать, чтобы определить, завершен ли процесс, или использовать что-то вроде вызова ajax, чтобы неоднократно пытаться загрузить страницу результатов, которая будет отображаться только после правильной записи транзакции.

Что касается связи между сценарием и базой данных, код будет продолжать выполняться независимо от состояния подключения браузеров, поэтому ваш код всегда будет получать ответ от MySQL и завершать выполнение, как ожидается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...