我遇到了最棘手的问题,试图从iOS设备与Django API进行通信并POST一个NSDictionary,似乎无法使其工作。 奇怪的是:相同的代码就像一个与Ruby API交谈的魅力。
这是我的ObjC方法:
- (void)makePostToServerWithClass:(NSString *)stringClass object:(NSDictionary *)parametersDict success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure
{ [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager setRequestSerializer:[AFJSONRequestSerializer serializer]];
[manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"];
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];
__block NSError *errorMessage;
NSMutableURLRequest *request = [manager.requestSerializer requestWithMethod:@"POST" URLString:[baseURLString stringByAppendingString:stringClass] parameters:parametersDict error:&errorMessage];
[request setTimeoutInterval:120];
AFHTTPRequestOperation *operation = [manager HTTPRequestOperationWithRequest:request success:^(AFHTTPRequestOperation *operation, id responseObject) {
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
success(operation, responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Error: %@", operation.responseString);
NSLog(@"ERROR2: %@", errorMessage.description);
NSLog(@"ERROR3: %@", error.description);
if(operation.responseObject)
errorMessage = [self creteErrorMessageForOperation:operation error:error];
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
failure(operation, errorMessage);
}];
[manager.operationQueue addOperation:operation];
}
在该代码中,URLString将是:
@"http://linuxServerIP:8080/api/v1/create_user/"
并且parametersDict将是一个包含以下内容的NSDictionary:
(lldb)po parametersDict
{ “raw_password”= 1234; username = testuser; }
在Linux服务器上,Django调试打印:
[28 / Mar / 2014 13:04:29]“GET / api / v1 / create_user / HTTP / 1.1”405 4
我在iOS上遇到的错误是:
错误3:错误域= NSCocoaErrorDomain代码= 3840“操作 无法完成。 (可可错误3840.)“(JSON文本没有开始 使用数组或对象以及允许未设置片段的选项。) UserInfo = 0xb44e5b0 {NSDebugDescription = JSON文本未启动 数组或对象以及允许未设置片段的选项。 NSUnderlyingError = 0xb44e860“请求失败:不允许使用方法 (405)“}
最奇怪的是:我正在发送一个POST,Linux服务器将错误打印为GET。
你们有什么想法我做错了吗? 正如我之前所说,它在Ruby API上运行良好。
答案 0 :(得分:0)
你应该从AFNetworking尝试这个功能: -
(AFHTTPRequestOperation *)POST:(NSString *)URLString
parameters:(NSDictionary *)parameters
constructingBodyWithBlock:(void (^)(id <AFMultipartFormData> formData))block
success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success
failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure
答案 1 :(得分:0)
以防万一有人在任何时候遇到同样的问题,这个问题是因为我使用名为RNCachingURLProtocol的POD从UIWebViews缓存检索到的图像和HTML页面而引起的。 由于某种原因,该POD干扰AFNetworking不允许它发出POST请求。 一旦我删除了RNCachingURLProtocol,一切都像魅力一样。