AFNetworking 2.0无法向DJANGO发帖(收到GET消息)

时间:2014-03-28 16:17:02

标签: ios objective-c django afnetworking-2

我遇到了最棘手的问题,试图从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] setNetworkActivityIndi​​catorVisible: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上运行良好。

2 个答案:

答案 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,一切都像魅力一样。