ASIHTTPRequest 返回 HTML 而不是 JSON

Posted

技术标签:

【中文标题】ASIHTTPRequest 返回 HTML 而不是 JSON【英文标题】:ASIHTTPRequest Returning HTML instead of JSON 【发布时间】:2011-07-05 21:24:03 【问题描述】:

我正在使用 ASIHTTPRequest 联系 API,问题是它返回的是 html 而不是 JSON,我不知道为什么。几个星期以来一切都很好,我似乎无法弄清楚是什么坏了..

奇怪的是,使用浏览器或 postie 执行完全相同的请求会返回正确的 JSON 响应,但是当我通过 ASIHTTPRequest 执行请求时,这些是我得到的响应标头:

"Cache-Control" = "private, max-age=0, must-revalidate";
    Connection = "keep-alive";
    "Content-Encoding" = gzip;
    "Content-Type" = "text/html; charset=utf-8";
    Date = "Tue, 05 Jul 2011 21:11:10 GMT";
    Etag = "\"e467792713ac4124f055c1719f4ea6c2\"";
    Server = "nginx/0.7.65";
    Status = "200 OK";
    "Transfer-Encoding" = Identity;
    "X-Runtime" = 1;

还有html(应该是json)..

<div id="universal_meta" logged_in_user_id="removed" style="display:none"></div>
<div id="meta" screen="projects" logged_in_as="removed"></div>
<h1>9 projects with 50 open issues</h1>
<ul class="biglinks progressbars">
 etc...

这是用于执行请求的代码..

NSURL *url = [NSURL URLWithString:path];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];

if(secure)
       [request setUsername:self.username];
       [request setPassword:self.password];


[request setDelegate:self];
[request setDidFinishSelector:@selector(requestDone:)];
[request setDidFailSelector:@selector(requestWentWrong:)];
[request setDownloadDestinationPath:destination];

[[self queue] addOperation:request]; //queue is an NSOperationQueue

我已经三次检查了所有登录详细信息/网址,一切都是正确的,我非常感谢任何帮助,因为我完全迷路了。

--

更新:

Lighthouse 已经承认他们这边的标题存在错误。等待他们的解决方案。

【问题讨论】:

您可以使用某种客户端工具作为 HTTPClient ditchnet.org/httpclient 来检查您的服务器端是否一切正常 【参考方案1】:

您是否检查过使用浏览器发送的标头与您通过代码发送请求时是否相同?

您是否尝试将“Accept”标头添加到您的请求中以定义您接受 json Content-Type?

[request addRequestHeader:@"Accept" value:@"application/json"];

【讨论】:

我已尝试设置内容类型,但未设置 Accept 标头,将尝试一下! 如果“Accept”标头不能解决您的问题,我建议您仍将浏览器发送的其他标头与您的代码发送的标头进行比较。即使您可以为此使用wireshark,大多数浏览器也允许您检查文档的HTTP 标头;在基于 WebKit 的浏览器(Chrome、Safari)中,您可以右键单击您的页面并选择“检查元素”,然后在“网络”窗格中,选择标识您的 HTML 页面的行(可能是唯一一个)并检查其“标题”标签。 我将进一步研究标题,设置 Accept 标题并没有解决问题 我仍然没有运气解决这个问题,匹配标题并不能解决我仍然从 API 获取 HTML 的问题 即使设置 User-Agent 一样?我看到的唯一剩下的选项是:(1)ASIHTTPRequest 在幕后添加了一些东西(我对此表示怀疑,但考虑直接尝试使用 NSURLConnection 来确定)或(2)您的 WebService 需要一些 cookie(用于对服务进行身份验证) orsthg)你的浏览器仍然在它的缓存中,但你的应用程序没有更多(这可能与关于logged_in_user_id="removed"的HTML答案中看到的内容相匹配?)【参考方案2】:

尝试使用诸如 wireshark 或 charlesproxy 之类的工具来比较来自浏览器/postie 的工作请求,并将它们与来自 ASIHTTPRequest 的非工作请求进行比较 - 一旦发现不同之处,应该很容易修复。

AliSoftware 的建议是您最可能看到的差异之一,但也可能存在其他差异。

【讨论】:

以上是关于ASIHTTPRequest 返回 HTML 而不是 JSON的主要内容,如果未能解决你的问题,请参考以下文章

ASIHTTPRequest中数据压缩问题与gzip

我应该如何处理 iOS 中的 ASIHTTPRequest 异步调用?

IOS-网络(ASIHTTPRequest的使用简介)

IOS开发 REST请求 ASIHTTPRequest用法

用Block封装ASIHttpRequest

ASIHTTPRequest中的DELETEPUTGETPOST请求实例-备用