从 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 响应的主要内容,如果未能解决你的问题,请参考以下文章

将数据从 PHP 脚本发送到 iOS

从 iOS 到 php 的 JSON 数据

如何在 IOS 上使用 Swift 解析 JSON,从 PHP 服务脚本发送?

从 Node Js 项目的应用程序收到的不完整响应

如何在php rabbitmq中将完整对象作为消息从生产者发送到消费者

PHP:如何从 JSON 中获取变量(从 Swift iOS 应用程序发送)并以 JSON 响应