ReSTful API:向 AJAX 请求返回一个值
ReSTful API: Returning a value to an AJAX Request
总结
好吧,我有点遗漏了一块拼图,请耐心等待。
首先,我有一个精简的 API 设置来处理在线商店的购物车。请参阅下面的 代码段 A 以了解其工作原理。
接下来,我向 API 提出了一个 AJAX 请求,以便 return 这个请求。请参阅下面的 代码段 B 以了解其工作原理。
问题是我无法制定一个简单的分步流程来传输此数据。一开始没问题,因为我所做的只是在购物车中添加和删除商品,但现在我希望能够使用 AJAX.
更新整个购物车
所需公式
- 使用脚本AJAX请求数据
- 在服务器上处理数据
- Return 数据到脚本
问题是 return 处理该数据,但 实际 问题未知。
疑难解答
异步请求
起初,我尝试从 API 到 AJAX 脚本 returning 数据到我的数据,只是为了确认它有效。我使用了异步请求,我被警告过不推荐使用,但它们并没有真正起作用。这应该有效吗?
也许是时候了?
这是一个荒谬的计划,但我还是做了。这是我通过 API 发送更新的地方,稍等片刻,然后通过 AJAX.
请求购物车内容
成功还是错误?
这个很烦人。所以我在某处读到我应该使用 success: function() { //Do stuff here }
来替换异步请求。但是,我的 API 似乎会随机 return "success" 和 "error" - 无法可靠地使用。我可以在 "success" 和 "error" 中请求刷新购物车 - 但这似乎是个坏主意。我认为最好询问这个社区并了解 假设 是如何工作的。
问题
发送 AJAX 请求、接收响应并根据该响应执行操作的 'jQuery' 方式是什么?
代码段 A
PHP
# This is my Slim Route, it responds when a post is made to domain/cart/api
$app->post('/cart/api', function($request) {
# Variables
global $products; // All Shop Products in an Array
$type = $request->getParsedBody()['type']; // Gets Type
$id = $request->getParsedBody()['id']; // Gets ID
# This 'if' statement determines what kind of request is being made.
if ($type == 'add_item') {
// Notice the "main" in "$products['main']" - that's just a product category
foreach($products['main'] as $product) {
// Checking if product exists
if ($product['id'] == $id) {
echo "Product found, name is: ".$product['name'];
array_push($_SESSION['cart'], $product);
}
}
} else if ($type == 'remove_item') { // Removes item from cart (in session)
unset($_SESSION['cart'][$id]);
}
# I just put return here because it felt right.
return;
});
片段 B
JavaScript
# Adding Item to cart (item_id identifies item)
function addToCart(item_id) {
$.ajax({
url: "/cart/api",
type: "POST",
data: {type: "add_item", id: item_id},
error: function(){
console.log("Failure");
},
success: function(){
console.log("Success");
window.location = "/cart";
}
});
return;
}
# Removing item from cart (item_id identifies item)
function removeFromCart(item_id) {
$.ajax({
url: "/cart/api",
type: "POST",
data: {type: "remove_item", id: item_id},
error: function(){
location.reload();
},
success: function(){
console.log("Success");
window.location = "/cart";
}
});
return;
}
就 Slim 代码而言,您必须从可调用路由中 return 一个 $response
,这样您就可以控制 HTTP 状态代码。对于错误,请使用 400 或更高的状态代码。
即
$app->post('/cart', function ($request, $response) {
return $response;
}
关于您的 PHP 代码的一些其他说明:
- 不要使用
#
发表评论
- 不要使用
global
。注入您的 $products
或使用 use ()
. 导入
- 如果您使用
$_SESSION
,请确保 jQuery 将会话 cookie 传回 PHP。
总是return对jQuery的回应。这可能应该是 JSON,所以类似于:
$data = ['result' => true];
return $response->withJson($data, 200);
成功案例
删除带有 unset($_SESSION['cart'][$id]);
的项目将不起作用,因为这不是您最初将产品添加到购物车的方式。
这是因为 array_push()
将使用顺序索引向 $_SESSION['cart']
数组添加一个项目(添加的第一个产品的索引为 0
,第二个产品的索引为 1
等 unset($_SESSION['cart'][$id])
将删除 id 索引处的项目,并且 $id 与 array_push()
在将产品添加到数组时创建的数组索引之间没有关系。
总结
好吧,我有点遗漏了一块拼图,请耐心等待。
首先,我有一个精简的 API 设置来处理在线商店的购物车。请参阅下面的 代码段 A 以了解其工作原理。
接下来,我向 API 提出了一个 AJAX 请求,以便 return 这个请求。请参阅下面的 代码段 B 以了解其工作原理。
问题是我无法制定一个简单的分步流程来传输此数据。一开始没问题,因为我所做的只是在购物车中添加和删除商品,但现在我希望能够使用 AJAX.
更新整个购物车所需公式
- 使用脚本AJAX请求数据
- 在服务器上处理数据
- Return 数据到脚本
问题是 return 处理该数据,但 实际 问题未知。
疑难解答
异步请求
起初,我尝试从 API 到 AJAX 脚本 returning 数据到我的数据,只是为了确认它有效。我使用了异步请求,我被警告过不推荐使用,但它们并没有真正起作用。这应该有效吗?
也许是时候了?
这是一个荒谬的计划,但我还是做了。这是我通过 API 发送更新的地方,稍等片刻,然后通过 AJAX.
请求购物车内容成功还是错误?
这个很烦人。所以我在某处读到我应该使用 success: function() { //Do stuff here }
来替换异步请求。但是,我的 API 似乎会随机 return "success" 和 "error" - 无法可靠地使用。我可以在 "success" 和 "error" 中请求刷新购物车 - 但这似乎是个坏主意。我认为最好询问这个社区并了解 假设 是如何工作的。
问题
发送 AJAX 请求、接收响应并根据该响应执行操作的 'jQuery' 方式是什么?
代码段 A
PHP
# This is my Slim Route, it responds when a post is made to domain/cart/api
$app->post('/cart/api', function($request) {
# Variables
global $products; // All Shop Products in an Array
$type = $request->getParsedBody()['type']; // Gets Type
$id = $request->getParsedBody()['id']; // Gets ID
# This 'if' statement determines what kind of request is being made.
if ($type == 'add_item') {
// Notice the "main" in "$products['main']" - that's just a product category
foreach($products['main'] as $product) {
// Checking if product exists
if ($product['id'] == $id) {
echo "Product found, name is: ".$product['name'];
array_push($_SESSION['cart'], $product);
}
}
} else if ($type == 'remove_item') { // Removes item from cart (in session)
unset($_SESSION['cart'][$id]);
}
# I just put return here because it felt right.
return;
});
片段 B
JavaScript
# Adding Item to cart (item_id identifies item)
function addToCart(item_id) {
$.ajax({
url: "/cart/api",
type: "POST",
data: {type: "add_item", id: item_id},
error: function(){
console.log("Failure");
},
success: function(){
console.log("Success");
window.location = "/cart";
}
});
return;
}
# Removing item from cart (item_id identifies item)
function removeFromCart(item_id) {
$.ajax({
url: "/cart/api",
type: "POST",
data: {type: "remove_item", id: item_id},
error: function(){
location.reload();
},
success: function(){
console.log("Success");
window.location = "/cart";
}
});
return;
}
就 Slim 代码而言,您必须从可调用路由中 return 一个 $response
,这样您就可以控制 HTTP 状态代码。对于错误,请使用 400 或更高的状态代码。
即
$app->post('/cart', function ($request, $response) {
return $response;
}
关于您的 PHP 代码的一些其他说明:
- 不要使用
#
发表评论 - 不要使用
global
。注入您的$products
或使用use ()
. 导入
- 如果您使用
$_SESSION
,请确保 jQuery 将会话 cookie 传回 PHP。 总是return对jQuery的回应。这可能应该是 JSON,所以类似于:
$data = ['result' => true]; return $response->withJson($data, 200);
成功案例
删除带有
unset($_SESSION['cart'][$id]);
的项目将不起作用,因为这不是您最初将产品添加到购物车的方式。这是因为
array_push()
将使用顺序索引向$_SESSION['cart']
数组添加一个项目(添加的第一个产品的索引为0
,第二个产品的索引为1
等unset($_SESSION['cart'][$id])
将删除 id 索引处的项目,并且 $id 与array_push()
在将产品添加到数组时创建的数组索引之间没有关系。