我正在编写自己的HTTP客户端和服务器,并希望客户端在请求中包含一个可选的主体.在服务器端,我想在发送HTTP响应之前读取整个主体.我的问题是在服务器上我怎么知道我已经阅读了整个身体?
即使在这种情况下我控制客户端和服务器,我正在寻找一种"标准"方法.但是,由于Content-Length是可选的,我想要一个不需要它的方法.如果客户端关闭连接,则很容易读取所有可用数据,但客户端需要保持连接打开以等待响应,因此此方法不起作用.
我能想到的只有身体的格式和检测终结者(例如</HTML>).理想情况下,我不想要那些知识.
我有一种方法可以忽略吗?
有没有办法在JQuery中处理来自ajax请求的错误,这样当用户离开页面时,会忽略生成的错误?
$(document).ready(function() {
$.ajax( {
url:'/server/url/',
type: 'POST',
data: {some..data},
success:function(response) { do stuff with response },
error: function(xhr, textStatus, errorThrown) {
// Don't raise this alert if user has navigated away from the page
alert('error');
}
});
Run Code Online (Sandbox Code Playgroud)
我很好奇是否有人知道一个干净的方法来处理这个问题?我知道你可以在一个$(window).bind("beforeunload", function(){})方法中创建一些逻辑但我更喜欢是否有办法处理这种情况而不这样做,因为Chrome似乎不再支持它.例如,在这种情况下返回特定错误吗?
谢谢.
当连接速度较慢的远程Web客户端无法发送带有multipart/form-data内容的完整POST请求但PHP仍然使用部分接收的数据来填充$_POST数组时,我遇到了问题.因此,$_POST数组中的一个值可能不完整,可能会丢失更多值.我首先尝试在Apache列表中提出相同的问题并得到一个答案,Apache不会缓冲请求体并将其作为巨型blob传递给PHP模块.
这是我的示例POST请求:
POST /test.php HTTP/1.0
Connection: close
Content-Length: 10000
Content-Type: multipart/form-data; boundary=ABCDEF
--ABCDEF
Content-Disposition: form-data; name="a"
A
--ABCDEF
Run Code Online (Sandbox Code Playgroud)
你可以看到这Content-Length是10000字节,但我只发送一个var a=A.
PHP脚本是:
<?php print_r($_REQUEST); ?>
Run Code Online (Sandbox Code Playgroud)
对于我的剩余请求,Web服务器等待大约10秒钟(但我没有发送任何内容),然后返回此响应:
HTTP/1.1 200 OK
Date: Wed, 27 Nov 2013 19:42:20 GMT
Server: Apache/2.2.22 (Debian)
X-Powered-By: PHP/5.4.4-14+deb7u3
Vary: Accept-Encoding
Content-Length: 23
Connection: close
Content-Type: text/html
Array
(
[a] => A
)
Run Code Online (Sandbox Code Playgroud)
所以这是我的问题:如何在PHP中验证邮件请求是否已完全收到?$_SERVER['CONTENT_LENGTH']将从10000请求标题显示,但有没有办法检查收到的实际内容长度?
我正在创建一个 Http 请求解析器。我正在以块(字节数组)形式获取数据并同时解析它。我想知道检测http请求结束的条件。该请求可能包含也可能不包含消息正文。
谢谢
我在Apache下运行PHP,我想发送一个慢速的POST数据到页面,当POST数据到达时,它会将消息写入数据库.我正在使用.NET应用程序发送数据,WebRequest并且我已设置SendChunked为true.
不幸的是,看起来PHP脚本在所有POST数据到达之前都没有开始执行.我查看了apache日志,我看到请求立即开始,但echo strftime(...)PHP脚本中的语句显示它在收到所有POST数据之后才运行.
有没有办法告诉PHP马上开始?我尝试always_populate_raw_post_data = Off在PHP.ini文件中设置,但这没有任何区别.我的请求的内容类型为application/octet-stream,并且$HTTP_RAW_POST_DATA仍然填充了所有POST数据.
我的设置是这样的(为简洁起见,简化):
<div class="methods">
<a href="#a">Method 1</a>
<a href="#b" class="fb_method">FB Method</a>
<a href="#c">Method 3</a>
</div>
... <!-- contents -->
Run Code Online (Sandbox Code Playgroud)
因此,每个方法(如果单击)将淡入内联内容,但具有"fb_method"类的锚除外,因为它需要先将AJAX请求添加到内容中的内容容器之前.
所以我的jQuery是这样的:
$('.methods a').click(function(){
// do something global to the anchors, eg : change the bg color, etc
// set the target container
var target = $(this).attr('href');
var xhr;
//if user clicks fb_method buttons
if($(this).hasClass('fb_method')){
//do ajax request - NOTE 1
xhr = $.post("/ajax/get_fb_albums.php",function(msg){
$(target).html('').append(msg).fadeIn();
});
}else{
//abort all ajax request
xhr.abort();
$(target).fadeIn();
}
return false;
});
Run Code Online (Sandbox Code Playgroud)
所以我想要的是当用户第一次点击fb_method按钮时,它会请求一个AJAX.但如果他们突然改变主意并点击其他方法,我想中止之前的AJAX请求.
我通过Firebug跟踪它,它返回xhr未定义的错误.如果我在if语句之前移动了注释1中的xhr,它可以工作,但AJAX请求仍在处理中.我的意思是在Firebug中,当我单击FB方法然后单击其他方法时,它显示如下:
// ajax request …Run Code Online (Sandbox Code Playgroud)