2012-02-09 37 views
1

我目前正在構建一個正在通過移動應用程序通過HTTP訪問的API。假設以下情形:移動應用程序向www.example.com/customers發送包含註冊數據的HTTP POST請求,API連接到數據庫,插入新記錄並返回200 OK以及一些用戶特定的註冊數據。處理參差不齊(移動)連接和API

現在假設數據庫中的插入操作正常,但200 OK響應從未將其發送到移動應用程序,壞連接/用戶關閉移動連接等。顯然,重複相同的POST請求不起作用因爲具有該用戶名/ ID的用戶已經存在。我將如何解決這個問題(並使用相同的機制保護API中的其他功能)?

此外,當我在考慮上述情況時,Web服務器和數據庫服務器之間也可能出現同樣的問題?例如:PHP腳本調用mysql_connect()連接到(遠程)數據庫,並調用mysql_query()。是否會發生數據庫服務器提交查詢,但由於某種原因,PHP腳本從數據庫連接中沒有收到「OK」,這是因爲連接不良或類似情況?

+0

首先,忽略它是移動的事實 - 想想你如何使交易成爲原子的 - 意味着遠程設備控制完成狀態 - 這是一個長期的主題,太長的評論 - 但每一次都完成天。 – KevinDTimm 2012-02-09 20:55:26

+0

@KevinDTimm感謝您的輸入。交易不是我的問題。也許我不是很清楚。在某一時刻,交易成功完成,遠程方面即將通知,當此失敗時該怎麼辦? (在TCP層面上)由於交易完成並不重要,數據庫內容很可能會改變,但沒有人收到通知。 – biggiesmalls 2012-02-09 20:59:59

回答

0

存儲會話變量,您可以使用該變量來確定進程是否已完成,或者使用類似ajax調用的方式來重複嘗試加載只會在事務正確記錄後纔會呈現的結果頁面。

就腳本和數據庫之間的通信而言,無論瀏覽器連接狀態如何,代碼都將繼續執行,因此您的代碼將始終從MySQL獲取響應並按預期完成執行。

+0

在我的問題的最後一段,我不是在談論瀏覽器<-->網絡服務器連接。想象一下,mysql_query剛剛發送了「COMMIT」給數據庫服務器(或一個自動提交的語句)。 mysql服務器現在將對腳本執行的COMMIT cmd做出響應,如果連接失敗,該怎麼辦? – biggiesmalls 2012-02-09 21:29:05

+0

當時PHP引發了一個異常,並且您手上有一個重大的基礎設施問題。 – PFY 2012-02-09 21:45:37

+0

任何想法如何處理這個?在這種情況下,mysql_query()是否會返回失敗,但實際查詢是否已被提交? – biggiesmalls 2012-02-10 08:47:03

1

您可能可以使用每個請求的事務ID來驗證實際請求是否已完成。

讓我詳細說明;對於移動應用程序所做的每個請求,您都會根據請求分配事務ID。服務器執行該操作,將事務保存爲已完成並返回消息,如:{「result」:200,「transaction」:1234123}。

如果客戶端沒有收到成功消息(由於網絡問題),它將重新傳輸具有相同事務ID的請求。當服務器收到該消息時,它將知道該事務已經完成並相應地響應客戶端。

您應該使用UUID作爲事務標識以確保唯一性。

+0

是的,這可能會工作,真的我想一些nonce。我的API還暴露了增加/減少計數器的函數。這可以用來防止重複重複的HTTP請求意外inc./dec。那些櫃檯。 – biggiesmalls 2012-02-09 21:25:08