2014-01-17 4 views
1

Я переношу ajaxed, оптимизированный для мобильных устройств веб-сайт в PhoneGap, но не смог получить POST на сервере. Из того, что я прочитал, в PhoneGap предполагаются возможности POSTS xhreq.Данные XMLHttpRequest PhoneGap приложения потеряны

Особенности: Я нацелен на платформу Android, используя последнюю версию Cordova 3.3.1-0.1.2, новейший Android SDK и Galaxy S3, обновленный Verizon до Android 4.3. Подключение к Wi-Fi на моем локальном сервере. В каждой попытке POST приходит на сервер как GET, без сообщений (проверяется с помощью tcpdump для проверки пакетов). Веб-сайт, оптимизированный для мобильных устройств, отлично работает в браузере на одном телефоне, а также через Wi-Fi.

Я изолировали случай потерпеть неудачу, создав новый проект 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 без данных сообщения. Я проверил несколько элементов конфигурации по умолчанию, чтобы убедиться, что они были необходимы:

В 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 с запросом HTTPServlet, поэтому request.getMethod() можно использовать, чтобы узнать, GET или PUT - я также проверил, увидев GET в tcpdump. Вы правы, что/json будет более точным для этого - я пробовал именно это, а также текстовое/обычное (прочитав дополнительную информацию о CORS на https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS и пытается квалифицироваться как «простой» запрос), но это само по себе это не делало. Я считаю, что я нашел пугало, но я отправлю в качестве ответа здесь. –

+0

Thanx для ответа. Вы используете андроид на эмуляторе или устройстве? Если это эмулятор, возможно, выполнение одного и того же запроса через завиток может помочь вам диагностировать. Вы хотите подтвердить, что сервер не перенаправлен (разрешение E.G. запрещено). Я не знаю, я просто использую это как пример. Проверка с помощью завитка должна помочь. – lorinpa

+0

Я использую реальное устройство, так как считаю, что они намного быстрее работают с эмуляторами, и, честно говоря, я сомневался, что эмулятор будет хорошим прокси-сервером для чего-то, что происходит на этом низком уровне по телефону. Но кто знает, мог бы кое-что чему-то научиться. Мне также интересны эти дополнения, которые утверждают, что вы можете использовать веб-инструменты для разработки (ala Chrome), но обеспокоены тем, что они тоже, возможно, предназначены для тех случаев, когда у вас есть вещи, работающие на более высоком уровне (например, основы coms sound) –

0

Проблема заключалась в переадресации IP-адресов, а не в том, что я изначально подозревал (пересылка на & из порта 80 на мой локальный сервер на порту 8080, который я использовал в течение многих лет, чтобы не допускать чтобы добавить: 8080 в URL-адрес браузера).

Именно это:

В MX записи для «mydomain.com», я имел www.mydomain.com указывая на IP-адрес моего сервера, но корень mydomain.com (адрес хоста я использую в URL-адресе XMLHttpRequest), перенаправляя на www.mydomain.com.

Это работало в обычном сеансе браузера, как если бы вы вводили mydomain.com, он просто отправляется на сайт www.mydomain.com, затем запускается оттуда - и он будет использовать все относительные пути в xhreq.

В PhoneGap, однако, для которого требуется указать полный путь, POST не осуществляли его через перенаправление. Это также вызывало вялое поведение загрузки изображения и некоторые причудливые зависания связи после многих нагрузок - я просто не понял, что проблема имеет одну и ту же причину (скорее я беспокоюсь о производительности WebView).

Отличная новость заключается в том, что POST сейчас работает нормально, и WebView, по-видимому, очень быстро подходит для моих нужд.

Чтобы подытожить решение: убедитесь, что субдомен (или его отсутствие) в полностью определенных URL-адресах, переданных в XMLHttpRequest (как требуется в PhoneGap), сопоставляются с IP-адресом (запись) и не перенаправляются в MX записи для вашего домена.

Смежные вопросы