使用 AFNetworking 2.0 的 POST 请求 - AFHTTPSessionManager
Posted
技术标签:
【中文标题】使用 AFNetworking 2.0 的 POST 请求 - AFHTTPSessionManager【英文标题】:POST request with AFNetworking 2.0 - AFHTTPSessionManager 【发布时间】:2013-10-30 10:50:11 【问题描述】:嘿嘿,
我正在努力向解析 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);
];
这样做我总是遇到这种错误:
Error Domain=NSCocoaErrorDomain Code=3840“操作无法完成。(Cocoa 错误 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";
谁能告诉我 Status: 400 Bad Request 告诉我什么以及如何摆脱它?
【问题讨论】:
【参考方案1】:这个错误意味着你的 POST 请求通过了,服务器成功返回了一些数据,NSJSONSerialization
解析有问题。
您可能需要设置您的 AFJSONResponseSerializer
以允许 JSON 片段。
在AFHTTPSessionManager
子类的init
方法中:
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,它将在请求发送和接收到您的控制台时记录它们。这个工具对于调试这类问题非常有帮助。
【讨论】:
(也有可能服务器返回的不是 JSON,在这种情况下您根本不想使用AFJSONResponseSerializer
。)
嘿,谢谢您的回复!我试过了,但在我收到另一种错误消息(见上面的更新)的那一刻,我认为原来的问题不再是主要问题......也许你也可以帮我解决这个问题?跨度>
您应该为此提出一个单独的问题。您的请求不是 Parse 的正确格式,服务器正在拒绝它。 (IE,您现在遇到的是 Parse 问题,而不是 AFNetworking 问题。)
尝试将 AFJSONRequestSerializer 设置为您的 AFHTTPRequestOperationManager,它对我有用: manager.requestSerializer = [AFJSONRequestSerializer serializer];【参考方案2】:
这对我有用:
在AFHTTPSessionManager
子类中使用以下序列化程序对其进行初始化:
[self setRequestSerializer:[AFHTTPRequestSerializer serializer]];
[self setResponseSerializer:[AFJSONResponseSerializer serializer]];
【讨论】:
以上是关于使用 AFNetworking 2.0 的 POST 请求 - AFHTTPSessionManager的主要内容,如果未能解决你的问题,请参考以下文章
AFNetworking 2.0,使用 NSURLSession 下载图片