Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Cordova AJAX POST权限_Javascript_Php_Jquery_Ajax_Cordova - Fatal编程技术网

Javascript Cordova AJAX POST权限

Javascript Cordova AJAX POST权限,javascript,php,jquery,ajax,cordova,Javascript,Php,Jquery,Ajax,Cordova,我正在构建一个Cordova应用程序,其中包含简单的REST呼叫 问题是,当我使用POST制作AJAX时,Chrome发送给我:“无法加载XMLHttpRequest。飞行前的响应在控制台上的HTTP状态代码405” 但是,如果我用GET调用AJAX(基本上是从数据库返回一个值),事情会很顺利 我的AJAX调用是: $.ajax({ url: "http://192.168.1.111/project/app", type: "POST", dataType: "json", c

我正在构建一个Cordova应用程序,其中包含简单的REST呼叫

问题是,当我使用POST制作AJAX时,Chrome发送给我:“无法加载XMLHttpRequest。飞行前的响应在控制台上的HTTP状态代码405”

但是,如果我用GET调用AJAX(基本上是从数据库返回一个值),事情会很顺利

我的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('addApp\n', 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#:访问config.xml中的源代码

<access origin="*" />
4#:在JavaScript中添加支持COR

$.support.cors = true;
$.mobile.allowCrossDomainPages = true;
5#:为了检查服务器POST中是否有错误,我使用了CURL并正常工作(成功)

OBS:我正在使用Slim框架来休息()

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

更新#1:

我已经将我的数据库和应用程序上传到一个在线主机上,结果仍然是一样的

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

更新#2:

在做另一个测试时,我注意到删除contentType:“application/json”调试器会显示另一个错误

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


两天来我一直在努力解决这个问题,但似乎没有任何解决办法。我真的很难过。

我想问题可能在于:


飞行前错误是由于客户机正在发出选项请求(在post之前);服务器未正确处理此请求。由于服务器不处理选项请求,因此不会处理下一篇文章。因此,首先检查调试器(或服务器上的嗅探),这是导致您提到的错误的请求。如果我的猜测是正确的处理它,你会看到下一篇文章将由客户正确执行

在阅读了StackOverflow中的60个问题以及有关CORS、PHP和访问控制的内容后,我找到了一个“简单的解决方案”

但是,在我发布解决方案之前,我想说的是,这类问题太“一般”,错误可能在任何地方

好的,首先,这个解决方案在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);
    }
});
第二步: 在RESTAPI中,您需要启用访问控制允许头文件,以便工作

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

目前,我的应用程序可以正常使用这些解决方案。我很高兴听到其他解决方案(也适用于Chrome)


谢谢你们

您的服务器不支持post,您可以向您显示操作代码吗?@Naumov抱歉,我忘记了这一点,我已经更新了我的问题。服务器帖子正在运行,我已经使用CURL对其进行了测试。我想这可能会帮助您和
url:http://192.168.1.111/project/app“
尝试不带shema的url
http://
@Naumov我尝试删除http://,但无效(未找到url)。此链接中的某些解决方案似乎也不起作用。扼杀您在浏览器中查看post请求发送?是的,在调试器中,选项显示在主错误之前。但是,我不知道这到底是什么。太好了!您必须在服务器上处理选项请求。
SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'name' cannot be empty
$.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);
    }
});
<?php header('Access-Control-Allow-Headers: X-Requested-With, origin, content-type'); ?>