这个 HTTP 请求是如何工作的?

Posted

技术标签:

【中文标题】这个 HTTP 请求是如何工作的?【英文标题】:How does this HTTP request work? 【发布时间】:2014-01-16 10:21:35 【问题描述】:

首先,这个问题主要涉及 HTTP 请求、BackboneJS、某种 RESTful API(例如 Slim API),以及这些东西如何相互配合。此外,这个问题来自一个在服务器端没有太多经验的人,而不仅仅是处理基本的 php/mysql 东西。

我一直在看 Backbone,也看过一些关于在后端使用 RESTful API 的教程(包括this one from 9bit)。

我还阅读了 this answer 的 *** 问题(了解 BackboneJS REST 调用)。

如果我打开一个 JS 文件,然后键入一些代码来发送一个 POST 请求,例如:

(function() 
var http = new XMLHttpRequest();

var value = ' "prop1": "value 1", "prop2": "value 2" ';

http.open('POST', 'dir', true);
http.setRequestHeader('Content-Type', 'application/json; charset=utf-8');
http.setRequestHeader('Content-Length', value.length);
http.onreadystatechange = function () 
    if (http.readyState == 4 && http.status == 200) 
        alert(http.responseText);
    

http.send(value); 
)();

我在控制台中看到它发送的 POST 请求看起来像这样:

Method: POST
Body:  "prop1": "value 1", "prop2": "value 2" 
Location: http://localhost/~myusername/Todo/dir/

然后,由于它只是我的本地服务器,服务器会发回一个响应,其中包含显示该目录中文件的基本 html 页面等。

我也尝试使用 GET 请求来检索类似的 JSON 对象,但显然我无法从该位置获取任何内容,大概是因为我试图从某个空文件夹请求的对象在任何地方都不存在。

我的问题是,当您使用诸如 .save() 之类的 BackboneJS 方法时,据我了解,在这种情况下,它可能会使用 PUT 方法来发送带有对象主体的请求,可能被解析为一个字符串,指向一个目录,例如“article/id”,其中“id”可能类似于“43”(可能是您发送的任何模型属性的相应 id)。所以...

1) API(例如Slim)对该请求做了什么? 2) 将这些对象属性保存到(MySQL 数据库)的位置在哪里? 3) 是否有一个文件,例如 'index.php',位于目录 'article' 中,其中脚本获取 POST 请求正文中的参数并用于与 MySQL 数据库通信? (我想知道为什么该位置只是一个“文件夹”,例如“/article”。换一种说法,每当您输入像“http://www.mywebsite.com”这样的网站时,服务器都会自动查找“ index'页面,例如'index.html',并自动打开该文件作为该目录的默认文件。在使用位置'/somefoldername'作为位置的上下文中是否发生相同类型的事情HTTP 请求)? 基本上,我觉得很奇怪,您只会向某个文件夹发送 HTTP 请求,而不是向处理请求并与数据库通信的特定 PHP 文件(例如)。使用带有 RESTful API 的 BackboneJS,我们的理论文件夹 '/article' 是否会存在,或者只是出于某种原因附加到 URL 中?

非常感谢。

【问题讨论】:

听起来您获得的是目录列表,而不是实际调用的代码,对吗?你配置你的服务器来处理 PHP 文件了吗? 是的,我安装了 PHP,等等。我的 AMP 堆栈工作正常,例如,如果我向一个文件(例如,'add_to_db.php')发送一个 POST/GET 请求,该文件与我的MySQL 数据库。在这方面没有问题。 是的,如果我向空目录发送请求,我希望得到一个目录列表。我的问题很简单,为什么在使用 Backbone 和 RESTful API 时,您会向 just 目录而不是脚本文件(如 PHP 文件)发送请求?我在这里缺少什么吗? 请求dir 而不是file 对我来说没有意义,您从哪里看到需要这样做的(文档)? 在我的问题第一部分列出的链接中。此外,如果您在 Google 上搜索 BackboneJS 以及它如何与服务器上的 RESTful API 一起工作,那么整个网络上都有大量教程。 【参考方案1】:

由于您是在 Slim 的上下文中提出问题的,所以我将这样回答,尽管大部分信息通常适用于其他 Web 应用程序/框架。

API(例如 Slim)对该请求做了什么?

不要厚颜无耻,但它会做你(或 API 开发人员)想让它做的任何事情(稍后会详细介绍)。

将这些对象属性保存到(MySQL 数据库)的哪里?

通常,这些对象属性用于创建资源 (POST) 或更新资源 (PUT),并且资源很可能被持久保存在某种存储中,无论是 RDMS 还是 NoSQL 解决方案.

是否有一个文件,例如“index.php”,位于“article”目录中,其中脚本获取 POST 请求正文中的参数并用于与 MySQL 数据库通信?

这就是事情变得有趣的地方,恕我直言。考虑到路由article/id,以下是 Slim 应用程序中发生的情况:

    在 example.com/article/22 收到请求 请求被路由到前端控制器脚本,该脚本根据请求 URI 和 HTTP 方法决定如何处理请求。 如果文章的 PUT 路由存在,则应用程序代码可能会获取请求正文并更新由提供的 id 标识的资源。

考虑到这一点,在 Slim 应用程序中,可能唯一的 Web 可访问文件是 index.php。看起来是目录的只是在应用程序的 index.php 中定义的路由,Slim 用来决定如何处理请求。考虑到这一点 。 . .

使用带有 RESTful API 的 BackboneJS,我们的理论文件夹 '/article' 是否会存在,或者只是出于某种原因附加到 URL 中?

在 Slim 应用程序的上下文中,不,/article 不会作为目录存在,而是作为路由存在。

也许这不会有太大帮助,但这就是 index.php 路由文件的一部分在 Slim 端的样子:

$app->post('/article', function () 
    // Get data from post
    // Create resource
);

$app->get('/article/:id', function ($id) 
    // Return an article resource identified by $id
);

$app->put('/article/:id', function ($id) 
    // Use $id to retrieve resource from storage
    // Update resource with request data
);

【讨论】:

好的,所以我点击主页 (index.php) 中的一个链接。该链接发送一个带有 /article/43 URI 的 POST 请求。 index.php 中的脚本(利用 Slim 的 API)告诉浏览器,如果它看到 URI /article/43,它应该执行一个回调函数,也许请求资源的一部分是函数的参数。理论上,回调函数可以从 NoSQL 数据库等返回 JSON 对象。这在某种程度上是正确的吗? 在这种情况下,这是否称为路由? 宾果游戏。 “路由”位是 API 如何在应用程序中不存在“/article/index.php”的情况下响应对“/article”的请求。看一个活生生的例子可能会有所帮助。这个 index.php (github.com/jeremykendall/flaming-archer/blob/develop/public/…) 是这个应用程序 (365.jeremykendall.net) 的前端控制器。照片端点的 POST 和 DELETE 路由可能特别相关。 @JoshBeam 另请参阅此问答:***.com/questions/9816274/…。许多好的、相关的 Backbone.js 信息和答案使用 Slim。

以上是关于这个 HTTP 请求是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章

HTTP请求是如何被转换成request对象的?

如何得知EBS中都有哪些请求是计划请求

HTTP Options 跨域时发送两个请求是怎么回事?

如何区分 Ajax 请求和普通 Http 请求?

这个http协议的post请求是啥意思?

Http option 请求是怎么回事