IOS在http请求中获得响应null

时间:2015-07-20 14:30:02

标签: ios nsurlconnection

我正在向服务器发送请求以测试特定情况。响应是自定义510 http错误,内容是错误信息。

首次发送请求时,Web服务正常运行。下次我尝试复制错误时,响应为零。但是,如果我更改请求以避免错误,它可以正常工作,响应就是它应该是什么。

我每次都用一个全新的对象执行请求。

@interface SCBaseConnection()

@property (strong, nonatomic) NSURLSessionDownloadTask *task;

@end

@implementation SCBaseConnection

- (instancetype) initWithUrl:(NSString *)url
                    path:(NSString *)path
                    body:(NSString *)body
                 headers:(NSDictionary *)headers
                  method:(NSString *)method
             requestCode:(NSInteger)requestCode
{
     self = [super init];

     NSLog(@"%@", headers);

     NSURL *uri = [NSURL URLWithString:[NSString stringWithFormat:@"%@%@", url, path]];

    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:uri];
request.HTTPMethod = method;

     if (body) {
        request.HTTPBody = [body dataUsingEncoding:NSUTF8StringEncoding];
    }

     if (headers) {
        NSArray *keys = [headers allKeys];
        for (NSString *key in keys) {
            [request setValue:[headers objectForKey:key] forHTTPHeaderField:key];
        }
     }

    NSURLSession *session = [NSURLSession sessionWithConfiguration:             [NSURLSessionConfiguration defaultSessionConfiguration]];
    self.task = [session downloadTaskWithRequest:request completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error) {

        int statusCode = (int)[response getStatusCode];
        NSLog(@"%@", @(statusCode));

        if (HTTP_UNAUTHORIZED == statusCode) {
            [[NSNotificationCenter defaultCenter] postNotificationName:kUnauthorizedHttpRequest object:response];
        }

        if (error) {
            [MCMGeneralUtils logError:error];
            NSLog(@"%@", error.userInfo);
            NSLog(@"%@", error);
        }
        NSData *res = [self dataFromFile:location];

        dispatch_async(dispatch_get_main_queue(), ^{
            [self.delegate didConnectionFinished:self
                                  statusCode:statusCode
                                    response:res
                                 requestPath:path
                                 requestCode:requestCode];
        });
    }];

    return self;
}

这是第二个请求之后的error.userInfo的内容。

NSErrorFailingURLKey = "http://192.168.1.201:23111/api/paciente";
NSErrorFailingURLStringKey = "http://192.168.1.201:2311/api/paciente";
NSLocalizedDescription = "The requested URL was not found on this server.";

请求第一次没有错误。

更新

- (IBAction)save:(UIBarButtonItem *)sender
{
    MCMPatientNew *patient = [MCMPatientNew new];
    patient.name = self.name;
    patient.lastname = self.lastname;
    patient.fullname = [NSString stringWithFormat:@"%@ %@", self.name, self.lastname];
    patient.email = self.email;
    patient.phones = [self extracPhones];
    patient.patientNew = YES;

    NSError *error = nil;
    if ([patient assertPatient:&error]) {
        MCMUser *user = [MCMUser loadUserInManagedContext:self.managedContext];
        patient.delegate = self;
        [patient storePatientInManagedContext:self.managedContext];
        if ([MCMGeneralUtils isInternetRechable]) {
            [self presentViewController:self.serverConnectionAlert animated:YES completion:nil];
            [patient postPatientWithToken:user.token doctorId:user.userId];
        } else {
            [self storeInRequestLogWithRequestCode:REQUEST_CODE_PACIENTE_INSERT
                                             appId:patient.appId
                                             ready:YES
                                  inManagedContext:self.managedContext];
            [self cancel:nil];
            [self postNotificationWithObject:patient];
        }
    } else {
        [self displayErrorMessageWithErrorInfo:error.userInfo];
    }
}

更新2

- (void)postPatientWithToken:(NSString *)accessToken doctorId:(NSNumber *)doctorId
{
    NSMutableDictionary *mutable = [NSMutableDictionary dictionaryWithDictionary:[self jsonToPost]];
    [mutable setObject:doctorId forKey:@"doctorId"];
    NSDictionary *body = @{@"obj" : mutable};
    [self connectToServerWithAccessToken:accessToken
                                    body:body
                                    path:PATH_PACIENTE_INSERT
                                  method:HTTP_METHOD_POST
                             requestCode:REQUEST_CODE_PACIENTE_INSERT
                                delegate:self];
}

-

- (void)connectToServerWithAccessToken:(NSString *)accessToken
                                  body:(NSDictionary *)body
                                  path:(NSString *)path
                                method:(NSString *)method
                           requestCode:(NSInteger)requestCode
                              delegate:(id<SCBaseConnectionDelegate>)delegate
{
    NSString *authenticator = [NSString stringWithFormat:@"Bearer %@", accessToken];
    NSDictionary *headers = @{HEADER_CONTENT_TYPE   : CONTENT_TYPE_APPLICATION_JSON,
                              HEADER_AUTHORIZATION  : authenticator};

    NSString *bodyStr = body ? [SCJson jsonFromDictionary:body] : @"";

    SCBaseConnection *connection = [[SCBaseConnection alloc] initWithUrl:API_URL
                                                                    path:path
                                                                    body:bodyStr
                                                                 headers:headers
                                                                  method:method
                                                             requestCode:requestCode];
    connection.delegate = delegate;
    [connection execute];
}

-

- (BOOL)execute
{
    if (self.task) {
        [self.task resume];
        return YES;
    }
    return NO;
}

0 个答案:

没有答案