AJAX调用 - 逻辑在哪里?

时间:2013-06-05 02:35:15

标签: javascript ajax json

这可能不是一个AngularJS问题,可能只是一个AJAX问题。我是前沿的“开发者”方面的新手,所以请耐心等待。

在进行AJAX调用以获取JSON数据时,返回和查看的数据背后的逻辑在哪里?在我看来,会有几种可能性,我想了解哪种是正确的选择以及为什么。

让我们使用搜索和播放Youtube视频的示例。

  1. 逻辑可能落到后端(控制器),其中JSON基于某些逻辑呈现,为您提供具有完全正确数据的JSON文件。即,您搜索“猫视频”,并且在进行AJAX调用时,您提取的JSON文件已被渲染为仅限猫视频。

  2. 另一端是Angular控制器具有逻辑。这意味着所有数据都被调用(猫视频以及其他所有内容......音乐视频,有趣的视频,教程等),然后在客户端进行排序。无论如何,这对我来说对客户来说效率更低/更慢,所以似乎没有意义。我想仍然可能会对客户端的数据进行一些过滤。因此,搜索“猫视频”可能不会返回所有视频,但绝对所有猫视频和任何基于视图,视频长度等的过滤都将在客户端完成(对比再次调用数据库以获取“新”视频集。)

  3. 不确定这是否准确,但您的工厂中是否有逻辑只返回部分数据?但是,我相信整个JSON文件需要呈现,但只返回部分。我想根据JSON文件呈现的位置(即后端或前端),这可能类似于选项#1或#2。

  4. 或许我完全误解了事情,而且这种方式完全不同!

    我基本上想弄清楚1.用户搜索术语和结果的场景如何显示,2。用户点击搜索结果,现在结果的更详细数据在其自己的页面上。以及如何最终解决问题。我正在寻找AngularJS的帮助,但我认为这最终是一个AJAX问题(单页应用程序与否)。

1 个答案:

答案 0 :(得分:4)

您可能会对一些关键概念感到困惑。

首先。 JSON不是文件,它是一种格式,更简单地说,是一种字符串。这对于折叠数组和存储地址 - 值对非常有用,因此很多数据都以这种格式传播。严格来说,它们是JSON对象,但它们很像字符串和数组。如果我没记错的话,它看起来像这样:

{ "name" : "john doe", "pet" : "dog", "hobby" : "parasailing" }

其次,AJAX是对服务器的请求,是在原始页面加载后从客户端(浏览器)发出的。也就是说,您输入'youtube.com'并且youtube服务器接收请求并将大量HTML发送回您的浏览器。

您观看视频,进行评分,浏览器不会重新加载页面,而是将单独的请求发送回具有您评级的youtube服务器。请求中有一个参数说“将其发送到ratingspage.php”。这个请求是AJAX。


现在,逻辑发生了(服务器端)。 ratingspage.php收到您的请求。它会联系数据库,更新或失败等等,并向您的浏览器发回响应。此响应可能采用JSON格式。

最后,您的浏览器会根据需要解析该响应并更新DOM(HTML文档)。

此时,值得注意的是,如果逻辑发生在客户端(浏览器),用户可以看到它 - 这是一个安全问题!因此,敏感操作应该在服务器端执行,您可以在其中测试和清理请求数据。


总结:

  • AJAX与初始加载事件分开。
  • 发送的信息是从客户端浏览器收集的
  • 逻辑发生在服务器端
  • 逻辑可以使用服务器理解的任何语言(PHP,Java,Ruby等)
  • 信息将返回浏览器
  • 发送和接收的信息可能使用JSON格式
  • 客户端的所有内容都发生在Javascript中

这是一个带有注释的简单ajax请求(在Javascript中完成)。这没有异常处理,状态检查,或任何其他不使用它!但它给了你基本的想法。

// Make a new request
var req = new XMLHttpRequest(); }                               

// Requests will have various states depending on whether they're processing,
// finished, error, etc.  We'll assume everything went OK.
// We need to establish a handler before the request
// is sent so it knows what to do.
req.onreadystatechange = function() {
    // Here's what the server sent back to the browser
    alert(req.responseText);
}

// Using the GET method, set up some parameters
req.open("GET", "somelogicpage.php?blah=blee&bloo=bar", true);
// Send the request
req.send(null);

服务器端,somelogicpage.php可能如下所示:

<?php
if ($_GET['blah'] != 'blee']) {
    // This is the response text!
    echo "Sorry, you need to blee when you blah.";
}
else {
    // (or this)
    echo "I'm ecstatic to report nothing is wrong!";
}
?>

您之前Javascript中处理函数的alert(req.responseText)会说出PHP已经转出的内容。

所以是的,您可以使用您喜欢的任何部分,并返回您喜欢的任何内容。 Javascript发出嘘声。