所有
这是一个发生很少的问题。事实上,我不得不花费大量时间来重现它,但无论如何它都在这里。
我正在使用ASIHTTPRequest从我的服务器获取一些数据。除了那些有responseStatusCode == 200之外的任何东西我都会抛出错误。我的服务器会返回一些消息。
我注意到,有时,根据我的无线连接(在笔记本电脑模拟器上使用),需要身份验证的那些,ASIHttpRequest返回200的响应,但是responseData类似于以下内容,而不是来自我的服务器的消息
<HTML><HEAD><TITLE>Cisco Systems Inc. Web Authentication Redirect</TITLE><META http-equiv="Cache-control" content="no-cache"><META http-equiv="Pragma" content="no-cache"><META http-equiv="Expires" content="-1"><META http-equiv="refresh" content="1; URL=https://webauth-redirect.oracle.com/login.html?redirect=17.22.111.222/scripts_dummy/messagesx.php"></HEAD></HTML>
这是对的吗?如果未收到来自服务器的消息,则responseStatusCode不应为200
以外的其他内容我该如何处理这种情况?检查responseStatusCode == 200之后的含义似乎不够好。这只是一个例子。在其他无线区域,打印出不同的垃圾。
更新 不确定这是否有任何作用,但我有
request.shouldUseRFC2616RedirectBehaviour = YES; // where request is ASIHTTPRequest
答案 0 :(得分:3)
这不是ASIHTTPRequest
或您的客户端代码的错误。这是服务器期望客户端成为Web浏览器并向其发送元刷新重定向(即,其中嵌入了重定向的HTML页面),而不是ASIHTTP
{{1}}将会处理的HTTP 30x对你而言。
这是如何滥用元刷新的一个很好的例子:它旨在刷新当前页面,但是人们开始使用它来将客户端发送到其他地方,这就是HTTP 30x已经设计的内容。谷歌搜索“元刷新vs 301重定向”将为您提供大量的博客文章。
在您的情况下,除非您可以让服务器对非浏览器客户端表现得更友好,否则当响应代码为200时,您需要自己检查此情况,解析重定向并自行重新发出请求。
答案 1 :(得分:1)
在考虑了一些之后,我想出了另一种策略。内容类型将被保留,不应混淆。
您应该能够将内容类型用作您正在接收代理注入页面的标志。设置内容类型参数,然后关闭该参数的app键。任何没有参数的响应都是无效的。
$content_type = 'text/html; FooCorp-MyApp=true'
BTW:如果你没有正确支持HTML处理,为什么要使用内容类型的text / html。元刷新应该是任何HTML引擎的一部分。如果您不需要HTML,则可能需要考虑使用特定于数据的内容类型,如XML,YAML或JSON。
问题已经提出,“这是有效的吗?”
类型,子类型和参数属性名称不区分大小写。参数值可能是也可能不区分大小写,具体取决于参数名称的语义。线性空白(LWS)不能在类型和子类型之间使用,也不能在属性和它的值之间使用。参数的存在与否可能对媒体类型的处理很重要,具体取决于媒体类型注册表中的定义。
请注意,某些较旧的HTTP应用程序无法识别媒体类型参数。将数据发送到较旧的HTTP应用程序时,实现应该只在该类型/子类型定义需要时才使用媒体类型参数。
对我而言,要点就是不要向旧客户发送非标准参数。在上下文中,如果您将其发送给自2000年以来制作的任何客户,则意味着您是安全的。
答案 2 :(得分:0)
我最终在响应头中传递了一个特殊的键/值对,以确保客户端理解响应来自我的服务器,而不是来自某些中间重定向。
function sendResponse($status = 200, $body = '', $content_type = 'text/html')
{
$status_header = 'HTTP/1.1 ' . $status . ' ' . getStatusCodeMessage($status);
header($status_header);
header('Content-type: ' . $content_type);
$value = 'success';
header('myApp:' . $value); // --> I will always check in my client that the key myApp has the value success
echo $body;
}