【发布时间】:2017-06-14 08:46:04
【问题描述】:
我正在尝试在 Zendesk 中将 NSData 转换为 NSString,但得到的字符串不完整,或者至少无法完全解码 data。
当我curl以下命令时:
curl https://mySubdomain.zendesk.com/api/v2/users/1038194884/tickets/requested.json -v -u myLogin:myPassword
我得到了正确的响应,它列出了这个用户的所有票,响应如下:
当我在objective-C 中尝试从iOS 应用程序中执行相同操作时,响应几乎相同,如下所示:
"Cache-Control" = "必须重新验证,私有,max-age=0"; 连接=“保持活动”; “内容编码”= gzip; “内容类型”=“应用程序/json;字符集=UTF-8”; 日期 =“星期六,2017 年 1 月 28 日 20:36:38 GMT”; Etag = "\"98b10cfcb2f1577122a1662926f9565c\""; 服务器 = nginx; “严格的运输安全”=“最大年龄=31536000;”; “传输编码” = 身份; “X-Content-Type-Options”= nosniff; “X-Frame-Options”=SAMEORIGIN; “X-Rack-Cache”=未命中; “X 速率限制”= 400; “X-Rate-Limit-Remaining”= 399; "X-Request-Id" = "53c1b462-2dec-4c46-cc60-ecf4bbd76e89"; “X-运行时间”=“0.209525”; "X-UA 兼容" = "IE=Edge,chrome=1"; “X-Zendesk-API-版本”= v2; "X-Zendesk-应用程序版本" = "v8.28"; "X-Zendesk-Origin-Server" = "app4.pod7.fra1.zdsys.com"; "X-Zendesk-Request-Id" = 675ae5b4ff78fbe7
问题是当我尝试将data 转换为dictionary 或NSString 时,我得到不完整的string。这是我正在使用的代码:
NSString *urlUser = [NSString stringWithFormat:@"https://mySubdomain.zendesk.com/api/v2/users/1038194884/tickets/requested.json"];
NSURL *url = [[NSURL alloc] initWithString:urlUser];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request addValue : @"application/json"
forHTTPHeaderField : @"Content-Type" ];
NSString *authStr = @"username:password";
NSData *authData = [authStr dataUsingEncoding:NSUTF8StringEncoding];
NSString *authValue = [NSString stringWithFormat: @"Basic %@",[authData base64EncodedStringWithOptions:0]];
[request setValue:authValue forHTTPHeaderField:@"Authorization"];
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *task = [session dataTaskWithRequest:request
completionHandler:
^(NSData *data, NSURLResponse *response, NSError *error) {
NSLog(@"finished");
if (!error)
{
NSLog(@"%@", data);
NSLog(@"RESPONSE: %@", response);
NSLog(@"length: %lu", data.length);
//Determine if string is null-terminated
char lastByte;
[data getBytes:&lastByte range:NSMakeRange([data length]-1, 1)];
NSString *str;
if (lastByte == 0x0) {
//string is null-terminated
str = [NSString stringWithUTF8String:[data bytes]];
} else {
//string is not null-terminated
str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
}
NSLog(@"string length: %lu", str.length);
NSLog(@"%@", str);
NSLog(@"stop");
}
}];
[task resume];
顺便说一句,data 的长度与curl 响应中的相同。
记录的字符串:
{"tickets":[{"url":"https://mySubdomain.zendesk.com/api/v2/tickets/407.json","id":407,"external_id":null,"via":{"channel":"mobile_sdk","source":{ "from":{},"to":{},"rel":"mobile_sdk"}},"created_at":"2017-01-26T10:48:28Z","updated_at":"2017-01-26T11 :05:42Z","type":null,"subject":"Commentário sobre exercício.","raw_subject":"Commentário sobre exercício.","description":"Nome do usuário: bruna villete\nObjectId: qHQzNbjUzy\nPlano: Iron Training - 巴西\n\nDETALHES DO EXERCÍCIO: \nTitulo: CADEIRA EXTENSORA\nObjectId: qvq5deXxD9\nPerfil: MULHER INICIANTE\nFrequência: 5\nPeríodo: Semana1\nSérie: Serie B\n\n评论里奥: \nbom","priority":null,"status":"solved","recipient":null,"requester_id":1038194884,"submitter_id":1038194884,"assignee_id":3030446965,"organization_id":null,"group_id ":24989965,"collaborator_ids":[],"forum_topic_id":null,"problem_id":null,"has_incidents":false,"is_public":true,"due_at":null,"tags":["seriecomment"] ,"custom_fields":[],"satisfaction_rating":null,"sharing_agreement_
【问题讨论】:
-
究竟是什么意思不完整的字符串?
-
这意味着它停在第一张票的中间......这个特定的用户有几个票,如图所示并以 curl 形式返回。请参阅字符串的编辑问题。谢谢。
-
您可以暂时将
UITextView添加到您的视图并将其text属性设置为您的字符串,而不是使用NSLog... -
您也可以尝试以这种方式记录它:
printf("%s", str.UTF8String);- 这样输出不应被切断。 -
@Jorge 最新的 Xcode 在 NSLog 和字典方面存在一些问题。这已被提及并询问了几个线程。在这里查看:stackoverflow.com/questions/39412917/…,对于 NSData 部分,我回答了如何解决您的问题,您需要将响应序列化为字典。如果答案解决了您的问题,请接受它是正确的:) GL
标签: ios objective-c json curl zendesk