AngularJS SlimPHP CRUD - $http.delete 不起作用 - XMLHttpRequest 无法加载
AngularJS SlimPHP CRUD - $http.delete doesn't work - XMLHttpRequest cannot load
使用 AngularJS 和 SlimPHP v3 创建 CRUD 时遇到问题。 $app->get 和 $app->post 一切正常,但 $app->delete.
出现错误
我在不同的域名上有前端和后端,因为我必须设置 htaccess 将所有内容重定向到 index.php 以便 Slim 工作,所以没有成功将前端和后端放在同一个域上。
这是我的 index.php
<?php
require __DIR__ . '/vendor/autoload.php';
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Message\ResponseInterface;
$app = new \Slim\App();
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Headers: Content-Type');
header('Access-Control-Allow-Methods: GET, PUT, POST, DELETE, OPTIONS');
$app->options('/test', function() use($app) {
$response = $app->response();
$app->response()->status(200);
$response->header('Access-Control-Allow-Origin', '*');
$response->header('Access-Control-Allow-Headers', 'Content-Type, X-Requested-With, X-authentication, X-client');
$response->header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
});
$app->get('/test/', function(Slim\Http\Request $request, Slim\Http\Response $response, array $args) {
$id = $args['id'];
$sql = "SELECT * FROM wp_osoft_orders";
$dbhost = "host";
$dbuser = "user";
$dbpass = "pass";
$dbname = "db";
$conn = new mysqli($dbhost, $dbuser, $dbpass, $dbname);
$headers = $response->getHeaders();
$response = $response->withHeader('Content-type', 'application/json');
$response = $response->withHeader('Access-Control-Allow-Origin', '*');
$headers = $response->getHeaders();
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$conn->set_charset("utf8");
$result = $conn->query($sql);
if ($result->num_rows > 0) {
$resultsArray = array();
while($row = $result->fetch_assoc()) {
array_push($resultsArray, $row);
}
$response->write(json_encode($resultsArray));
}
else {
$response->write("0 results");
}
$conn->close();
});
$app->delete('/test/{id}', function(Slim\Http\Request $request, Slim\Http\Response $response, array $args) {
$response = $response->withHeader('Access-Control-Allow-Origin', '*');
$response->write("delete is OK");
});
$app->run();
?>
这是我的 Angular 代码:
function getOrders(){
$http.get("url/test/").success(function(data){
$scope.orders = data;
});
};
getOrders();
$scope.deleteOrder = function (orderId) {
console.log("order to delete id: " + orderId);
$http.delete("url/test/"+orderId).success(function(response){
console.log('delete response: ' + response);
});
getOrders();
};
我在 Angular 中正确地得到了 console.log 的订单 ID,但随后我得到:
删除url/test/22
XMLHttpRequest 无法加载 url/test/22。请求的资源上不存在 'Access-Control-Allow-Origin' header。因此不允许 Origin 'url' 访问。响应具有 HTTP 状态代码 400。
每次我写 url/ 我的意思是 http://mywebsite.com,但无法 post 有 2+ 个链接的问题。
感谢您的帮助。
CorsSlim 是您的朋友,它是在 Slim Framework 世界中启用 CORS 的更简单方法。使用composer安装并使用:
$app->delete('/test/{id}', function(Slim\Http\Request $request, Slim\Http\Response $response, array $args) {
$response->write("delete is OK");
})->add(\CorsSlim\CorsSlim::routeMiddleware());
通过这种方式,您将确保请求包含必要的 headers。
旁注
在您的示例中,您仅在 /test
上使用 $app->options
而未在 /test/{id}
上使用。
使用 AngularJS 和 SlimPHP v3 创建 CRUD 时遇到问题。 $app->get 和 $app->post 一切正常,但 $app->delete.
出现错误我在不同的域名上有前端和后端,因为我必须设置 htaccess 将所有内容重定向到 index.php 以便 Slim 工作,所以没有成功将前端和后端放在同一个域上。 这是我的 index.php
<?php
require __DIR__ . '/vendor/autoload.php';
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Message\ResponseInterface;
$app = new \Slim\App();
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Headers: Content-Type');
header('Access-Control-Allow-Methods: GET, PUT, POST, DELETE, OPTIONS');
$app->options('/test', function() use($app) {
$response = $app->response();
$app->response()->status(200);
$response->header('Access-Control-Allow-Origin', '*');
$response->header('Access-Control-Allow-Headers', 'Content-Type, X-Requested-With, X-authentication, X-client');
$response->header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
});
$app->get('/test/', function(Slim\Http\Request $request, Slim\Http\Response $response, array $args) {
$id = $args['id'];
$sql = "SELECT * FROM wp_osoft_orders";
$dbhost = "host";
$dbuser = "user";
$dbpass = "pass";
$dbname = "db";
$conn = new mysqli($dbhost, $dbuser, $dbpass, $dbname);
$headers = $response->getHeaders();
$response = $response->withHeader('Content-type', 'application/json');
$response = $response->withHeader('Access-Control-Allow-Origin', '*');
$headers = $response->getHeaders();
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$conn->set_charset("utf8");
$result = $conn->query($sql);
if ($result->num_rows > 0) {
$resultsArray = array();
while($row = $result->fetch_assoc()) {
array_push($resultsArray, $row);
}
$response->write(json_encode($resultsArray));
}
else {
$response->write("0 results");
}
$conn->close();
});
$app->delete('/test/{id}', function(Slim\Http\Request $request, Slim\Http\Response $response, array $args) {
$response = $response->withHeader('Access-Control-Allow-Origin', '*');
$response->write("delete is OK");
});
$app->run();
?>
这是我的 Angular 代码:
function getOrders(){
$http.get("url/test/").success(function(data){
$scope.orders = data;
});
};
getOrders();
$scope.deleteOrder = function (orderId) {
console.log("order to delete id: " + orderId);
$http.delete("url/test/"+orderId).success(function(response){
console.log('delete response: ' + response);
});
getOrders();
};
我在 Angular 中正确地得到了 console.log 的订单 ID,但随后我得到:
删除url/test/22 XMLHttpRequest 无法加载 url/test/22。请求的资源上不存在 'Access-Control-Allow-Origin' header。因此不允许 Origin 'url' 访问。响应具有 HTTP 状态代码 400。
每次我写 url/ 我的意思是 http://mywebsite.com,但无法 post 有 2+ 个链接的问题。
感谢您的帮助。
CorsSlim 是您的朋友,它是在 Slim Framework 世界中启用 CORS 的更简单方法。使用composer安装并使用:
$app->delete('/test/{id}', function(Slim\Http\Request $request, Slim\Http\Response $response, array $args) {
$response->write("delete is OK");
})->add(\CorsSlim\CorsSlim::routeMiddleware());
通过这种方式,您将确保请求包含必要的 headers。
旁注
在您的示例中,您仅在 /test
上使用 $app->options
而未在 /test/{id}
上使用。