0

我不断收到以下错误消息:2013-01-22 01:44:43.091 Section3App2[16625:6703] -[__NSCFArray length]: unrecognized selector sent to instance 0x23a48780提交我的 AFNetworking 请求后。请求背后的想法是,我们通过 POST 向带有 JSON 请求正文的 REST API 发送一个 post 请求。我整天都在摆弄这个,似乎无法弄清楚是什么导致了问题。

代码

NSString *string = @"[{\"code\":\"105N14560\"}]";
    NSString * jsonString = 字符串;
    NSData * 数据 = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
    NSError * 错误 = 零;
    id json = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
        [请求 setHTTPBody:json];
       // [请求 setValue:[NSString stringWithFormat:@"%d", string.length] forHTTPHeaderField:@"Content-Length"];
        NSLog(@"请求正文:%@", request.HTTPBody);
       // NSLog(@"json: %@",json);
// 如果 (!json) {
// // 处理错误
// NSLog(@"失败");
// }
        AFJSONRequestOperation *operation2 = [AFJSONRequestOperation JSONRequestOperationWithRequest:请求成功:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
            NSLog(@"JSON: %@", JSON);
        } 失败:无];
        [操作2开始];

该代码成功地创建了请求正文,但是当它尝试运行该块时,它会抛出错误,我完全被难住了。所有帮助将不胜感激。

4

1 回答 1

3

永远不要像在第一行中那样尝试自己构建 JSON 字符串。用于NSJSONSerialization从与 JSON 兼容的 Obj-C 数据结构(如NSDictionaryNSArray)直接转换为NSData对象以用作请求的主体。例如:

NSDictionary *JSON = [NSDictionary dictionaryWithObject:@"105N14560" forKey:@"code"];
id JSONData = [NSJSONSerialization dataWithJSONObject:JSON options:0 error:error];

您应该将生成的JSONData对象用于HTTPBody请求的 以及content-length请求的 。这是一个完整的例子:

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:URL]; // URL = wherever the request should be sent to 

[request setHTTPMethod:@"POST"];
[request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[request setValue:@"application/json" forHTTPHeaderField:@"content-type"];

id JSONData = [NSJSONSerialization dataWithJSONObject:JSON options:0 error:error];
if (JSONData) {
    [request setValue:[NSString stringWithFormat:@"%d",[(NSData *)JSONData length]] forHTTPHeaderField:@"content-length"];
    [request setHTTPBody:JSONData];
}

这只是创建请求。其余部分很简单 using AFNetworking,使用AFJSONRequestOperation你只需像你已经完成的那样传递请求。

于 2013-01-22T14:24:32.523 回答