gpt4 book ai didi

javascript - Cordova AJAX POST 权限

转载 作者:可可西里 更新时间:2023-11-01 12:21:19 26 4
gpt4 key购买 nike

我正在构建一个带有简单 REST 调用的 Cordova 应用程序。

问题是当我使用 POST 创建 AJAX 时,Chrome 在控制台上向我发送:“XMLHttpRequest 无法加载 http://192.168.1.111/project/app。预检响应具有无效的 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 中的 POST 处理程序

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中访问origin

<access origin="*" />

2#: 添加connect-src MY IP到meta标签

<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#:在我的 REST 应用 .htaccess 中添加 Access-Control-Allow-Origin

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

4#:在JavaScript中添加支持cors

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

5#:为了检查服务器 POST 是否没有错误,我使用了 CURL 并且工作正常(成功)

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

OBS:我正在使用 Slim 框架来 REST (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

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

我已经尝试解决这个问题两天了,但似乎没有任何解决方案。我真的很难过。

最佳答案

我觉得问题可能是这样的:

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

关于javascript - Cordova AJAX POST 权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35675588/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com