ReSTful API:向 AJAX 请求返回一个值

ReSTful API: Returning a value to an AJAX Request

总结

好吧,我有点遗漏了一块拼图,请耐心等待。

首先,我有一个精简的 API 设置来处理在线商店的购物车。请参阅下面的 代码段 A 以了解其工作原理。

接下来,我向 API 提出了一个 AJAX 请求,以便 return 这个请求。请参阅下面的 代码段 B 以了解其工作原理。

问题是我无法制定一个简单的分步流程来传输此数据。一开始没问题,因为我所做的只是在购物车中添加和删除商品,但现在我希望能够使用 AJAX.

更新整个购物车

所需公式

  1. 使用脚本AJAX请求数据
  2. 在服务器上处理数据
  3. 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,第二个产品的索引为 1unset($_SESSION['cart'][$id]) 将删除 id 索引处的项目,并且 $id 与 array_push() 在将产品添加到数组时创建的数组索引之间没有关系。