Javascript Cordova AJAX POST权限
我正在构建一个Cordova应用程序,其中包含简单的REST呼叫 问题是,当我使用POST制作AJAX时,Chrome发送给我:“无法加载XMLHttpRequest。飞行前的响应在控制台上的HTTP状态代码405” 但是,如果我用GET调用AJAX(基本上是从数据库返回一个值),事情会很顺利 我的AJAX调用是: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
$.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的urlhttp://
@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'); ?>