使用AFNetworking 2.0的POST请求 - AFHTTPSessionManager

时间:2013-10-30 10:50:11

标签: objective-c json post afnetworking afnetworking-2

HeJ小鼠,

我正在努力对解析REST API执行POST请求。我正在使用AFNetworking 2.0。我对AFHTTPSessionManager子类的代码如下所示:

+ (ParseAPISession *)sharedSession {
     static ParseAPISession *sharedSession = nil;
     static dispatch_once_t onceToken;
     dispatch_once(&onceToken, ^{
         sharedSession = [[ParseAPISession alloc] initWithBaseURL:[NSURL URLWithString:kSDFParseAPIBaseURLString]];
    });
   return sharedSession;
}

- (id)initWithBaseURL:(NSURL *)url {
    self = [super initWithBaseURL:url];
    if (self) {
       [self.requestSerializer setValue:kSDFParseAPIApplicationId forHTTPHeaderField:@"X-Parse-Application-Id"];
       [self.requestSerializer setValue:kSDFParseAPIKey forHTTPHeaderField:@"X-Parse-REST-API-Key"];
   }

   return self;
}

我正在做这样的请求:

[[ParseAPISession sharedSession] POST:@"ClassName" parameters: [NSDictionary dictionaryWithObjectsAndKeys:@"name", @"name", nil] 
                              success:^(NSURLSessionDataTask *task, id abc) {
                                  NSLog(@"%@", abc);
                              } failure:^(NSURLSessionDataTask *task, NSError *error) {
                                  NSLog(@"%@", error);
}];

这样做我总是遇到这种错误:

  

错误Domain = NSCocoaErrorDomain Code = 3840“操作无法完成。(Cocoa error 3840.)”(JSON文本没有以数组或对象开头,并且选项允许未设置片段。)UserInfo = 0x8c72420 {NSDebugDescription = JSON文本不是以数组或对象开头,而是选项允许未设置片段。}

由于GET请求就像一个魅力,我很困惑,为什么我不能发布一些东西。有人可以解决这个问题吗?

祝你好运!

更新

经过大量测试后,这个错误消息不再显示了,不幸的是另一个出现了:

<NSHTTPURLResponse: 0x8b96d40>
{ URL: https://api.parse.com/1/users }
{ status code: 400, 
headers {
    "Access-Control-Allow-Origin" = "*";
    "Access-Control-Request-Method" = "*";
    "Cache-Control" = "no-cache";
    Connection = "keep-alive";
    "Content-Length" = 130;
    "Content-Type" = "application/json; charset=utf-8";
    Date = "Wed, 30 Oct 2013 20:01:58 GMT";
    Server = "nginx/1.4.2";
    "Set-Cookie" = "_parse_session=BAh7BkkiD3Nlc3Npb25faWQGOgZFRiIlNjIxZjUxMzY3NWVhZWJmMDYyYWYwMGJiZTQ3MThmMWE%3D--851bd31b07e7dba2c5f83bb13a8d801ecbea42c4; domain=.parse.com; path=/; expires=Fri, 29-Nov-2013 20:01:58 GMT; secure; HttpOnly";
    Status = "400 Bad Request";
    "X-Runtime" = "0.060910";
    "X-UA-Compatible" = "IE=Edge,chrome=1";
} }

有谁能告诉我状态:400 Bad Request告诉我什么以及如何摆脱它?

2 个答案:

答案 0 :(得分:9)

此错误表示您的POST请求已通过,服务器已成功返回一些NSJSONSerialization解析时遇到问题的数据。

您可能需要将AFJSONResponseSerializer设置为允许JSON片段。

init子类的AFHTTPSessionManager方法中:

AFJSONResponseSerializer *responseSerializer = [AFJSONResponseSerializer serializerWithReadingOptions:NSJSONReadingAllowFragments];
[self setResponseSerializer:responseSerializer];

如果这不起作用,则可能存在编码问题。来自NSJSONSerialization类引用:

  

数据必须采用JSON规范中列出的5种支持编码之一:UTF-8,UTF-16LE,UTF-16BE,UTF-32LE,UTF-32BE。数据可能有也可能没有BOM。用于解析的最有效编码是UTF-8,因此如果您可以选择对传递给此方法的数据进行编码,请使用UTF-8。

检查服务器发送的编码类型。

最后,您可以在AFNetworking内部设置断点,或设置AFNetworkActivityLogger,这会在请求发送和接收到控制台时记录请求。此工具对于调试此类问题非常有用。

答案 1 :(得分:1)

这对我有用:

AFHTTPSessionManager子类中的

使用以下序列化程序对其进行初始化:

[self setRequestSerializer:[AFHTTPRequestSerializer serializer]]; [self setResponseSerializer:[AFJSONResponseSerializer serializer]];