我正在编写自己的HTTP客户端和服务器,并希望客户端在请求中包含一个可选的主体.在服务器端,我想在发送HTTP响应之前读取整个主体.我的问题是在服务器上我怎么知道我已经阅读了整个身体?
即使在这种情况下我控制客户端和服务器,我正在寻找一种"标准"方法.但是,由于Content-Length是可选的,我想要一个不需要它的方法.如果客户端关闭连接,则很容易读取所有可用数据,但客户端需要保持连接打开以等待响应,因此此方法不起作用.
我能想到的只有身体的格式和检测终结者(例如</HTML>).理想情况下,我不想要那些知识.
我有一种方法可以忽略吗?
我在LAMP环境中发现了一个奇怪的现象.
在前端,我用jQuery执行一个AJAX post请求,如下所示:
$.post('save.php', {data1: d1, data2: d2, [...], dataN: dN})
Run Code Online (Sandbox Code Playgroud)
的变量d1,以dN从网站(例如,从文字输入,文字区域,复选框等)与jQuery预先收集.
该文件save.php将post参数data1传递给dataN一个查询并将其保存在数据库中.
除非我在请求期间更改页面(例如,通过单击链接),否则请求大约需要500毫秒并且没有问题.
通常情况下,我希望请求被中止和忽略(这很好)但是(这是奇怪的行为)请求似乎已经完成,但只有部分数据被传输并因此被保存.
这意味着,例如,PHP脚本只保存data1到data5并设置data6到dataN空.
这个问题似乎已经被AJAX请求(不是PHP脚本),因为场引起$_POST['data6'],以$_POST['dataN']在PHP中没有设置在这种情况下.
所以我的问题:
为什么会发生这种情况(这是预期的行为)?
我怎么能避免呢?
更新
问题既不是jQuery也不是php.jQuery正确收集值并尝试将它们发布到php.我刚刚验证了它 - 它有效.另一方面,php脚本处理它按预期获得的所有内容 - 它只是没有收到整个请求.
所以问题必然是被中断的请求本身.与我预期它不会中止或失败不同,它仍会传输所有数据直到中断.
然后php获取此帖子数据并开始处理它 - 显然缺少一些信息.
更新2
我加入一个参数固定的问题eof后dataN,并检查它是否是PHP设置.通过这种方式,我可以确保传输了整个请求.
然而,这并不能解决我仍然不理解的问题的根源.
有人帮忙吗?