【问题标题】:Converting NSData to NSString in NSURLConnection = null在 NSURLConnection = null 中将 NSData 转换为 NSString
【发布时间】:2014-10-28 12:47:35
【问题描述】:

我正在向服务器发送数据,它正在响应我的请求,并且我在网络中收到如下所示的文本...我在NSString* newStr = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]; 中的问题在哪里?它没有响应我的 NSData而responseData中有数据。

我的回复信息:

{ret:0,msg:"<B>Your request has submitted</B><br/>Your request number is 123 <br/>Have a nice day.<br/>"}

我的代码:

    NSString *link = @"http://example.jsp";

NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"first_name=%@&last_name=%@&phone=%@", link, nameField.text, surnameField.text, phoneField.text]];

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

[request setHTTPMethod:@"POST"];

NSURLResponse *response;
NSError *err;
NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&err];

NSLog(@"responseData: %@", responseData);

NSString* newStr = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];

NSLog(@"Finish %@", newStr); // newStr is null!!

UIAlertView *message = [[UIAlertView alloc] initWithTitle:title
                                                  message:newStr
                                                 delegate:self
                                        cancelButtonTitle:@"OK"
                                        otherButtonTitles:nil];
[message show];

【问题讨论】:

  • 你能显示你的“url”结果吗
  • @Anbu.Karthik example.com/on/… 但这无济于事。
  • 你的网址无效,你没有得到答案,但是编码很好,你的代码没有问题,只要检查你的网址是否有效
  • 我已经从服务器进行了检查,并且可以通过网络正常进入。 NSData 看起来像 但是当我转换它时我得到空值。 @Anbu.Karthik 对不起,我无法分享链接
  • 我试过你的代码,你传递的请求 URL 无效

标签: ios objective-c nsstring nsdata


【解决方案1】:

您的 url 变量可能已经是 nil,因为您的字符串 (first_name=…) 不是有效的 URL:它甚至没有方案,也没有主机。

我敢打赌,如果您仔细观察,Xcode 会显示一个警告,即您的格式包含三个占位符 (%@),但您传递了四个参数。你可能真正想做的是这样的事情;

[NSString stringWithFormat:@"%@?first_name=%@&last_name=%@&phone=%@", link, nameField.text, surnameField.text, phoneField.text]

(注意开头附加的%@?。)

在评论中你提到你确实收到了数据(所以你的代码只是一个虚拟的?)。如果您的电话[[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding] 返回nil,则意味着您的responseData 不是UTF-8(这是一项壮举,我从未见过该方法失败;我确实收到了垃圾,但从未收到nil )。不过,您引用的部分看起来很正常:它解码为\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n{ret:0,msg:"<B>Y

【讨论】:

  • 感谢您的回答...我只是拍摄了我的链接的一部分,实际上它很长,这就是为什么它看起来不对。通常我可以在服务器中看到它工作正常。 NSData 正在获取数据,但我无法将其转换为 NSSting。
  • @CAN:仔细检查发送的数据(例如通过将数据写入文件或进行网络跟踪)。它很可能不是有效的 UTF-8。
  • 是的,在我将编码更改为 NSWindowsCP1254StringEncoding 后,它现在正在工作。但是中间有一个很大的空地
【解决方案2】:

你分配了 responseData 吗? 你可以通过使用委托来做到这一点

-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
-(void)connectionDidFinishLoading:(NSURLConnection *)connection

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
  NSString* newStr = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];

 NSLog(@"Finish %@", newStr); // newStr is null!!

UIAlertView *message = [[UIAlertView alloc] initWithTitle:title
                                              message:newStr
                                             delegate:self
                                    cancelButtonTitle:@"OK"
                                    otherButtonTitles:nil];
[message show];
 }

【讨论】:

  • responseData 是他调用+[NSURLConnection sendSynchronousRequest:returningResponse:error:] 的返回值。您引用的委托调用仅用于 异步 连接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-21
  • 2012-11-09
  • 2011-11-11
相关资源
最近更新 更多