AFNetworking 将 NSMutableDictionary 作为 POST 发送
Posted
技术标签:
【中文标题】AFNetworking 将 NSMutableDictionary 作为 POST 发送【英文标题】:AFNetworking sending NSMutableDictionary as POST 【发布时间】:2014-12-03 20:06:13 【问题描述】:我刚开始使用 AFNetworking。我设法在堆栈溢出中的一个好人的帮助下使 GET 请求工作。
现在我坚持发出 POST 请求。我尝试了这段代码,但我总是以失败的块告终。怎么会?
-(void) postEventInfo: (NSMutableDictionary *) eventInfoObject
NSURL *url = [NSURL URLWithString:string];
AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithBaseURL:url];
manager.requestSerializer = [AFJSONRequestSerializer serializer];
manager.responseSerializer = [AFJSONResponseSerializer serializer];
[manager POST:string parameters:eventInfoObject success:^(NSURLSessionDataTask *task, id responseObject)
NSLog(@"JSON: %@", responseObject);
//here is place for code executed in success case
failure:^(NSURLSessionDataTask *task, NSError *error)
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Error while sending POST"
message:@"Sorry, try again."
delegate:nil
cancelButtonTitle:@"Ok"
otherButtonTitles:nil];
[alertView show];
NSLog(@"Error: %@", [error localizedDescription]);
];
我收到以下错误消息:
错误:请求失败:内部服务器错误 (500)
谢谢..
EDIT1
好的,所以在测试了一点之后,我注意到连接实际上已经通过并且 inte 做了我想做的事情,但它仍然向我显示了错误消息,这意味着仍然会进入失败块。
我认为我的服务器正在发回 text/html,这可能与此有关吗?
这部分是 NSURLConnection 工作的
EDIT2
NSError *error;
NSData *event = [NSJSONSerialization dataWithJSONObject:eventInfoObject
options:NSJSONWritingPrettyPrinted
error:&error];
if (! event)
NSLog(@"Got an error: %@", error);
else
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setHTTPMethod:@"POST"];
[request setHTTPBody:event];
[request setValue:[NSString stringWithFormat:@"%lu", (unsigned long)[event length]] forHTTPHeaderField:@"Content-Length"];
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[request setURL:[NSURL URLWithString:string]];
NSURLConnection *conn = [[NSURLConnection alloc]initWithRequest:request delegate:self];
[conn start];
【问题讨论】:
你的服务器崩溃了。 但是为什么。当我使用 Normal NSURLConnection @Andy 发送它时它工作正常 你发送 application/json 对吗? 是的,我需要在代码中这么说吗? @安迪 RequestSerializer 应该这样做 【参考方案1】:如果您的服务器没有设置application/json
的Content-Type
标头(或等效项),AFHTTPSessionManager
将失败。理论上,您可以对 AFNetworking acceptableContentTypes
值进行陪审,但更好的是,您应该修复服务器代码以返回适当的 Content-Type
标头。
但是,如果您的服务器以 500 代码响应,那么您有一些更根本的问题,如果没有有关服务器的更多信息(例如代码、有关实施的一些细节等),我们可能无法解决这个问题。
如果您有一个有效的NSURLConnection
示例,我倾向于同时运行该代码以及上述代码,并通过Charles 观察请求。仔细查看请求的差异,问题可能会跳出来。
【讨论】:
感谢查尔斯!我会使用它并查找它 我想我实际上设法改变,以便服务器发送 application/json 代替。我怎么知道,因为转到 url 我可以看到文本字体发生了变化。我下载了 Charles,但我似乎无法让它显示模拟器发出的请求。我看到一些教程,我必须手动放置代理和端口,但我的 ios 模拟器没有我可以按下的 wifi 选项卡?我该如何解决这个@Rob 我在模拟器之前启动它。但是,如果您检查您的模拟器并尝试找到 wifi 选项卡来选择代理和端口。你不会找到它。如果模拟器没有无线选项卡@Rob,我不知道在哪里配置设置 我不知道你对这个 wifi 标签的意思。我从来没有见过,也从来没有做过任何事情。底线,如果 http(即非 SSL),你不必做任何事情。如果使用 SSL,请转到“代理”-“代理设置...”,然后单击 SSL 选项卡。 使用 Charles 进行查找。我看到 post 消息已发送,类型为 html/text。观看了我的服务器代码,发现我忘记更改它发回信息的某些部分。所以有些地方发回了 application/json 和一些部分 html/text,将其全部更改为 application/json 解决了问题。谢谢!! 【参考方案2】:所以问题在于,使用 AFNetworking,您可以为 HTTP 管理器设置基本 URL,例如
http://api.example.com/
但是当您发布请求时,您使用端点(相对于基本 URL 的路径)而不是绝对 URL,例如
[manager POST:@"users/add" ...
哪个AFNetworking在后台自动转换成绝对URL:
http://api.example.com/users/add
这显然是为了方便构建 API 客户端,这就是为什么 POST、GET 和其他方法采用字符串参数而不是 NSURL 的原因。
在你的特定情况下改变
[manager POST:string ...
到
[manager POST:@"/" ...
应该有效地解决问题。
【讨论】:
没用 :(,post 方法仍然有效,我的数据正在发布和更新,但警报视图仍然显示@Andy以上是关于AFNetworking 将 NSMutableDictionary 作为 POST 发送的主要内容,如果未能解决你的问题,请参考以下文章
无法将令牌附加到 API 调用(基本身份验证、AFNetworking)