Кордова AJAX POST разрешение

Я создаю приложение Cordova с простыми вызовами REST.

проблема в том, что когда я делаю AJAX с POST, Chrome отправляет мне: " XMLHttpRequest не может загрузить http://192.168.1.111/project/app. Ответ для preflight имеет недопустимый код состояния HTTP 405" на консоли.

но, если я делаю вызов AJAX с GET (в основном возвращаю значение из базы данных), вещи работают как шарм.

мой вызов AJAX есть:

$.ajax({
  url: "http://192.168.1.111/project/app",
  type: "POST",
  dataType: "json",
  contentType: 'application/json',
  data: {
    "name": "Cordova"
  },
  success: function() {
    navigator.notification.alert("Success!");
  },
  error: function(jqXHR, textStatus, errorThrown) {
    console.log(textStatus + jqXHR.responseText);
  }
});

обработчик сообщений в REST

require 'Slim/Slim.php';
$app = new Slim();
$app->post('/app', 'addApp');
$app->run();

function addApp() {
    error_log('addAppn', 3, '/var/tmp/php.log');
    $request = Slim::getInstance()->request();
    $callback = json_decode($request->getBody());
    $sql = "INSERT INTO app (name) VALUES (:name)";
    try {
        $db = getConnection();
        $stmt = $db->prepare($sql);  
        $stmt->bindParam("name", $callback->name);
        $stmt->execute();
        $callback->id = $db->lastInsertId();
        $db = null;
        echo json_encode($callback); 
    } catch(PDOException $e) {
        error_log($e->getMessage(), 3, '/var/tmp/php.log');
        echo '{"error":{"text":'. $e->getMessage() .'}}'; 
    }
}

function getConnection() {
    $dbhost="localhost";
    $dbuser="myuser";
    $dbpass="mypass";
    $dbname="mydb";
    $dbh = new PDO("mysql:host=$dbhost;dbname=$dbname", $dbuser, $dbpass);  
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    return $dbh;
}

что я пробовал:

1#: доступ к origin в config.в XML

<access origin="*" />

2#: добавьте connect-src мой IP в мета-тег

<meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: https://ssl.gstatic.com 'unsafe-eval'; style-src 'self' 'unsafe-inline'; media-src *; connect-src 'self' http://192.168.1.111">

3#: добавьте Access-Control-Allow-Origin в мое приложение REST .реврайт

Header add Access-Control-Allow-Origin "*"
Header add Access-Control-Allow-Methods: "GET,POST,OPTIONS,DELETE,PUT"

4#: добавить поддержку cors в В JavaScript

$.support.cors = true;
$.mobile.allowCrossDomainPages = true;

5#: чтобы проверить, нет ли ошибки в сообщении сервера, я использовал CURL и работает нормально (успех)

curl -i -X POST -H 'Content-Type: application/json' -d '{"name": "Cordova"}' http://192.168.1.111/project/app

OBS: я использую Slim framework для отдыха (http://coenraets.org/blog/2011/12/restful-services-with-jquery-php-and-the-slim-framework/)

================

обновление #1:

Я загрузил свою базу данных и приложение на онлайн-хост и результаты все те же.

================

обновление #2:

делая другие тесты, я заметил, что удаление contentType: "application / json" отладчик показывает другую ошибку.

SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'name' cannot be empty

================

прошло два дня, что я пытаюсь решить эту проблему, и ничего не появляется в качестве решения. Мне очень грустно.

2 ответов


Я думаю, проблема может быть в следующем:

ошибка preflight связана с тем, что клиент делает запрос опций (до публикации); этот запрос не обрабатывается правильно сервером. Поскольку запрос опций не обрабатывается сервером, следующая запись не обрабатывается. Поэтому прежде всего проверьте с отладчиком (или нюхая на сервере), который является запросом, который вызывает ошибку, которую вы упоминаете. Если моя догадка верна, обработайте ее, и вы увидите, что следующий пост будет правильно вычеркнут клиентом.


после прочтения около 60 вопросов в StackOverflow и вещей о CORS, PHP и Access Control я достигаю "простого решения".

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

Ok, во-первых, решение не работает на Chrome. Chrome всегда возвращает код состояния 405, но при запуске приложения cordova на реальных устройствах (или симуляторах) решение работает как шарм. Да, это о Chrome блокирует междоменные запросы.

первый этап:

данные в AJAX должны быть помещены с' {}'. Да, я не знал об этом. Если вам нужно, играйте вокруг JSON.stringify сделать намного проще.

$.ajax({
    url: "http://myonlineurl.com/project/app",
    type: "POST",
    dataType: "json",
    contentType: 'application/json',
    data: '{ "name": "Cordova", "another_thing" : "thing" }',
    success: function() {
        navigator.notification.alert("Success!");
    },
    error: function(jqXHR, textStatus, errorThrown) {
        console.log(textStatus + jqXHR.responseText);
    }
});

Шаг второй:

в REST API вам необходимо включить Управление Доступом-Разрешить-Заголовки для работы вещей.

<?php header('Access-Control-Allow-Headers: X-Requested-With, origin, content-type'); ?>

На данный момент мое приложение работает нормально с этими решениями. Я рад слышать о другие решения (для работы в Chrome тоже).

Спасибо, ребята!