NSMutableRequest не работает во второй раз (ARC включен)

Я выполняю запрос JSON POST, нажав UIButton, и после отправки можно выполнить segue execute. Итак, после отправки значений я не могу больше выполнять POST-запрос. Он показывает код состояния 200 и ответ в порядке. Но данные не отражаются в Backend. Вот мой код:

(IBAction)transitsurveydone:(id)sender {
    if([tempArray count]!=0){
       /* alert= [[UIAlertView alloc] initWithTitle:@"Survey Submission"
                                          message:@"Please Enter your location"
                                         delegate:self
                                cancelButtonTitle:@"Modify"
                                otherButtonTitles:@"Submit",nil];
        alert.alertViewStyle = UIAlertViewStylePlainTextInput;
        alert.tag=2;
        [alert show];*/

        NSLog(@"Caption array is %@ %@",captionArray,tempArray);

        NSURL *URL = [NSURL URLWithString:[NSString stringWithFormat:@"myURL"]];

        NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:URL];
        [request setHTTPMethod:@"POST"];
        [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];

        NSMutableDictionary *postDict = [[NSMutableDictionary alloc]init];


        NSMutableDictionary *d=[[NSMutableDictionary alloc] initWithObjectsAndKeys:@10,@"\"Bus\"", nil];
            NSMutableArray *m=[[NSMutableArray alloc] init];

        NSString *str1,*str2,*str3,*str4;
               // Checking the format






        if(tempArray.count==1){
            for (int x=0; x<1; x++) {
                str1=[NSString stringWithFormat:@"\"%@\"",[captionArray objectAtIndex:x]];
                [d setObject:[tempArray objectAtIndex:x]  forKey:str1];


            }


        [request setHTTPBody:[[NSString stringWithFormat: @"{\n    \"instance\" : %@,\n    \"response_method\": \"web\",\n    \"routes\": [\n                {%@:%@}\n        ]\n}",randomString,str1,[d objectForKey:str1] ]dataUsingEncoding:NSUTF8StringEncoding]];
        }
          NSLog(@"%@:%@",str1,[d objectForKey:str1]);        
        NSURLSession *session = [NSURLSession sharedSession];
        NSURLSessionDataTask *task = [session dataTaskWithRequest:request
                                                completionHandler:
                                      ^(NSData *data, NSURLResponse *response, NSError *error) {

                                          if (error) {
                                              // Handle error...
                                              return;
                                          }

                                          if ([response isKindOfClass:[NSHTTPURLResponse class]]) {
                                              NSLog(@"Response HTTP Status code: %ld\n", (long)[(NSHTTPURLResponse *)response statusCode]);
                                              NSLog(@"Response HTTP Headers:\n%@\n", [(NSHTTPURLResponse *)response allHeaderFields]);
                                          }

                                          NSString* body = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
                                          NSLog(@"Response Body:\n%@\n", body);
                                      }];
        [task resume];


        NSHTTPURLResponse *response = nil;
        NSError *error = nil;


        NSData *respData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
        NSLog(@"~~~~~ Status code: %d", [response statusCode]);

        if([response statusCode]==200){
            UIAlertView  *alert = [[UIAlertView alloc] initWithTitle:nil message:@"Transit Survey submitted" delegate:self cancelButtonTitle:nil otherButtonTitles:nil];
            alert.transform = CGAffineTransformMakeTranslation( 10, 740);
            [alert show];
            [self performSelector:@selector(dismissAlert:) withObject:alert afterDelay:1.0f];
            submitteddonthide=NO;
        }
        else{
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil message:@"Transit Survey Submission Failed" delegate:self cancelButtonTitle:nil otherButtonTitles:nil];
        alert.transform = CGAffineTransformMakeTranslation( 10, 740);
        [alert show];
        [self performSelector:@selector(dismissAlert:) withObject:alert afterDelay:1.0f];
        }


        if([prefs integerForKey:@"humandone"]==1){
            [self performSegueWithIdentifier:@"transittohuman" sender:nil];
        }
        else{
            [self performSegueWithIdentifier:@"gobackfromtransit" sender:nil];
        }


    }

`

Приведенный выше код находится в IBAction

3 ответа

Ваш код выглядит хорошо, и нет никаких проблем. Если эта проблема возникает постоянно, добавьте надстройку "Advanced Rest Client" в браузер chrome и проверьте URL-адрес вашего сервера, передавая соответствующие входные значения. Если этот процесс также не может обновлять значения в вашем бэкэнде, то в вашем бэкэнде должна быть какая-то проблема.

Да. После некоторой борьбы Очистка куки мне очень помогла:-

Вот кусок кода, который довольно прост

 NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
 NSArray *cookies = [cookieStorage cookiesForURL:[NSURL URLWithString:urlString]];
    for (NSHTTPCookie *cookie in cookies) {
        NSLog(@"Deleting cookie for domain: %@", [cookie domain]);
        [cookieStorage deleteCookie:cookie];
    }

Спасибо мистер Реддис и Роб за предложения

Пара мыслей:

  1. Вы используете код состояния, чтобы определить, правильно ли сервер вставил данные или нет. Вам действительно нужно, чтобы ваш веб-сервис создавал утвердительный ответ (в JSON, было бы замечательно), который говорит, были ли данные успешно вставлены или нет. Вы не должны полагаться исключительно на код ответа на запрос веб-сервера.

  2. Я бы наблюдал запрос с чем-то вроде Чарльза и убедился, что он выглядит хорошо.

  3. Вы создаете JSON-запрос вручную, что очень хрупко. Я бы предложил использовать Чарльза для наблюдения за запросом, скопировать и вставить его на http://jsonlint.com/ и убедиться, что он в порядке.

  4. Еще лучше, используйте NSJSONSerialization который является более надежным и простым в использовании.

  5. Кроме того, вы отправляете этот запрос дважды. Потеряйте этот второй запрос (вы все равно не должны выполнять синхронные запросы) и поместите всю логику подтверждения в блок обработчика завершения сеанса.

Другие вопросы по тегам