2014-01-17 38 views
1

我正在將一個經過手動優化的Ajaxed網站移植到PhoneGap,但未能成功獲取POST到服務器。從我讀過的文章來看,xhreq POSTS應該可以在PhoneGap中使用。PhoneGap應用程序的XMLHttpRequest POST數據丟失

具體內容:我針對Android平臺,採用最新的Cordova 3.3.1-0.1.2,最新的Android SDK以及由Verizon更新至Android 4.3的Galaxy S3。連接是通過無線連接到我的本地服務器。在每一次嘗試中,POST都以GET的形式到達服務器,沒有發佈數據(使用tcpdump檢查數據包進行驗證)。移動設備優化的網站在同一部手機的瀏覽器上也可以正常工作,也可以通過WiFi訪問。

我已經通過創建一個全新的PhoneGap項目分離失敗的情況下,無非就是:

$ cordova create Hello 
$ cd Hello 
$ cordova platform add android 

然後在index.js,在onDeviceReady處理程序結束,加入片斷我第一次測試在一個簡單的瀏覽器頁面(域這裏取代):

// TEST POST CAPABILITY 
var req = new XMLHttpRequest(); 
req.onreadystatechange = function() { 
    if (req.readyState==4 && (req.status==200 || req.status==0)) { 
    console.log("POST Response: " + req.responseText); 
    } 
}; 
var t = new Date().getTime(); // Just to foil any caching 
req.open("POST", "http://mydomain.com/services/rpc?t=" + t, true); // async 
req.setRequestHeader('Content-type','application/text; charset=utf-8'); 
var postContent = JSON.stringify({id:t, method:"misc.log", params:[{log:"POST Test"}]}); 
req.send(postContent); 

然後在手機上運行帶有:

$ cordova run android 

它像失敗的應用程序一樣失敗,以無GET數據的GET方式到達服務器。我覈實了幾個配置項的默認值,以確保他們的要求:

在config.xml中:

<access origin="*" /> 

在AndroidManifest.xml:

<uses-permission android:name="android.permission.INTERNET" /> 

任何想法,什麼可能出問題了,還是要看其他的東西?

謝謝。

+1

我相信,由於客戶端和服務器不在同一個域中,因此存在CORS問題。它要求你使用jsonp,但jsonp只會允許GET請求。 – Tom

+0

phonegap應用程序中的客戶端實際上是文件系統,因此服務器域自然會有所不同 - 從我在PhoneGap文檔和各種帖子中可以找到的信息,他們通過配置處理此問題,默認允許所有域(如上)。只是爲了踢踢我試圖(暫時)改變服務器端以允許任何事情,以及通過添加://只是測試,試圖讓PhoneGap RPC的工作... response.setHeader(「Access-Control-Allow-Origin」,「 *「); response.setHeader(「Access-Control-Allow-Methods」,「GET POST」); –

+0

我剛剛注意到帖子#15260609,這不是PhoneGap特定的,但類似的「POST變成GET與下降的內容」方面 - 我嘗試瞭解決方案那裏(用斜線結束URL),但它沒有更正問題。但是,我想知道是否有其他原因可能導致類似的「重新嘗試GET」。 –

回答

0

你的內容類型應設置爲

"application/json"

JSON.stringify()創建JSON內容。

接下來,您可以告訴我們您的服務器進程是如何確定請求類型的。你能發佈相關的代碼嗎?

我會從調整內容類型值開始。看看這是否有所作爲。

希望有所幫助。

+0

這是一個tomcat servlet,HTTPServlet請求,所以request.getMethod()可用於查看它是否一個GET或者PUT - 我也驗證過在tcpdump中看到GET。你說得對/ json會更準確 - 我試過了,還有text/plain(在閱讀了更多關於CORS的信息,在https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS,並試圖限定爲「簡單」請求)..但僅此而已。我相信我已經找到了柏忌,但我會在這裏發佈答案。 –

+0

Thanx的答覆。你在模擬器或設備上運行android嗎?如果它是模擬器,也許可以通過curl運行相同的請求可以幫助您診斷。你想驗證你沒有被服務器重定向(E.G.權限被拒絕)。我不太可能,我只是以此爲例。驗證卷曲應該有所幫助。 – lorinpa

+0

我正在使用一個實際的設備,因爲我發現它們比仿真器要快很多,說實話,我懷疑模擬器是否會成爲手機上這種低級別事件的良好代理。但是誰知道呢,也可能在那裏學到了一些東西。我也很好奇那些聲稱允許你使用網絡開發工具(ala Chrome)的附加軟件 - 但是也擔心它們也可能是爲你在更高層次上工作而設計的(例如,基本的coms sound) –

0

問題是一個IP轉發的問題,而不是我最初懷疑的問題(從端口80轉發到&到端口8080的本地服務器,我多年來一直使用它作爲一種方便,將8080添加到瀏覽器網址中)。

它是這樣的:

在MX記錄「mydomain.com」,我不得不www.mydomain.com指着我的服務器的IP地址,但根本mydomain.com(主機地址我用在URL到XMLHttpRequest中),重定向到www.mydomain.com。

這工作在一個正常的瀏覽器會話,就像你輸入mydomain。它只是去www.mydomain.com,然後從那裏運行 - 它會使用xhreq中的所有相對路徑。

然而,在PhoneGap中,需要指定完整路徑,POST並沒有通過重定向。這也導致圖像加載行爲緩慢和一些奇怪的通信掛斷後很多負載 - 我只是沒有意識到問題有相同的根本原因(而是我擔心WebView性能)。

好消息是,POST現在工作正常,並且WebView似乎足以滿足我的需求。

總結解決方案:確保完全限定的URL中傳遞給XMLHttpRequest(如PhoneGap所需)的子域(或缺少)映射到MX地址(A記錄),而不是重定向到MX記錄您的域名。

相關問題