从 php 到 iOS 应用程序的不完整 json 响应
Posted
技术标签:
【中文标题】从 php 到 iOS 应用程序的不完整 json 响应【英文标题】:Incomplete json response from php to iOS app 【发布时间】:2014-02-11 22:40:51 【问题描述】:在我的 ios 应用程序中,我有一个异步连接,它在我的服务器上调用一个 php 脚本。该脚本对数据库进行查询并使用 json_encode 给出响应。
这是脚本:
$result = mysql_unbuffered_query($query);
if ($result)
while ($row = mysql_fetch_array($result, MYSQL_ASSOC))
$output[] = $row;
if($output!=null)
echo json_encode($output);
else
echo "0";
当响应很短时一切正常,但是当我有很长的响应(比如 500 个字符)时,我收到一个不完整的 json,例如:
["user":"1","password":"password","tel":"3333333333","description":"some text, some text, some text","data":"2013-10-13 09:53:54", "user":"1","password":"password","tel":"3333333333","description":"some text, so
在我的 iOS 应用程序中,我使用此代码来解码 json:
json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];
如果我收到一个完整的 json,一切正常,否则如果我收到一个不完整的 json,我会发送一个新请求。当json内容很长很长的时候,接收到的json是不完整的,但是有时候,经过一些请求,反正响应是好的。
/* 更新问题 */
执行请求:
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:advertURL] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
[request setHTTPMethod:@"POST"];
NSString *queryString = [NSString stringWithFormat: @"%@", query];
[request setHTTPBody:[postString dataUsingEncoding:NSUTF8StringEncoding]];
myConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
得到响应:
//in NSURL method didReceiveResponse
ResponseData = [[NSMutableData alloc] init];
//in NSURL method didReceiveData
[ResponseData appendData:data];
NSString *result = [[NSString alloc] initWithData:ResponseData encoding:NSUTF8StringEncoding];
json = [NSJSONSerialization JSONObjectWithData:Responsedata options:kNilOptions error:&error];
if(!json)
//incomplete json!
else
//good json!
为什么会这样?我该如何解决这个问题?
希望我自己解释一下,谢谢。
【问题讨论】:
请发布您执行网络请求和接收数据的代码。 @Rob 你读懂了我的想法。 您可能应该发送正确的 http 标头,例如 Content-Length 和 Content-Type 好的,现在我了解了 NSURL didReceiveData 方法的工作原理。当我的变量 responseData 已满时,我必须将我的最后一个代码放在 connectionDidFinishLoading 方法中。谢谢罗! 【参考方案1】:当人们使用NSURLConnectionDataDelegate
方法(或NSURLSessionDataDelegate
方法)时,此问题很常见,但没有意识到它可能需要多次调用didReceiveData
才能接收整个有效负载。
那么,你可以做的是:
在didReceiveResponse
中实例化NSMutableData
;
让didReceiveData
只将数据附加到NSMutableData
,认识到对于较大的有效负载,在接收到所有数据之前可能需要多次调用此方法;和
在connectionDidFinishLoading:
中(如果使用NSURLConnection
;如果使用NSURLSession
,则使用URLSession:task:didCompleteWithError:
方法),然后在收到所有数据后继续解析。
【讨论】:
以上是关于从 php 到 iOS 应用程序的不完整 json 响应的主要内容,如果未能解决你的问题,请参考以下文章
如何在 IOS 上使用 Swift 解析 JSON,从 PHP 服务脚本发送?