2014-03-13 1 views
1

에서 JSON 스트림 구문 분석에 실패한다. 게이트웨이 사용자 이름과 암호를 사용하여 웹 서비스가 차단되었습니다. 게이트 웨이에 사용자 이름과 암호를 전달하기 위해 어떤 코드가 포함되어야합니까? 왜 이런 일이 일어나는 걸까요? 응답 코드를 0으로받습니다. 또한 누군가가 웹 서비스와 아이폰 OS에서 JSON에 대해 배울 수있는 좋은 자습서를 제공 할 수 있다면. 미리 감사드립니다.연결은 내가 <strong>JSON과 Webservice를</strong>를 사용하여 간단한 로그인을 사용하려고 IOS

여기 내 코드입니다. 코드는로 작성됩니다 UIButton

  NSString *post = [NSString stringWithFormat:@"&Email=%@&Password=%@", 
       [self.emailTextField text], [self.passwordTextfield text]]; 
      NSLog(@"PostData: %@",post); 

      NSURL *url = [NSURL URLWithString:@"http:/Gateway/api/json/reply/ZympayAuthenticateCustomer"]; 

      NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; 
      NSString *postLength = [NSString stringWithFormat:@"%d",[postData length]]; 

      NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; 
      [request setURL:url]; 
      [request setHTTPMethod:@"POST"]; 
      [request setValue:postLength forHTTPHeaderField:@"Content-Length"]; 
      [request setValue:@"application/json" forHTTPHeaderField:@"Accept"]; 
      [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; 
      [request setHTTPBody:postData]; 

      NSError *error = [[NSError alloc] init]; 
      NSHTTPURLResponse *response = nil; 
      NSData *urlData = [NSURLConnection sendSynchronousRequest:request 
                returningResponse:&response error:&error]; 
      NSLog(@"Response code: %ld", (long)[response statusCode]); 
      if ([response statusCode] >= 200 && [response statusCode] < 300) { 
       NSString *responseData = [[NSString alloc]initWithData:urlData 
                   encoding:NSUTF8StringEncoding]; 
       NSLog(@"Response ==> %@", responseData); 
       NSError *error = nil; 
       NSDictionary *jsonData = [NSJSONSerialization JSONObjectWithData:urlData 
                  options:NSJSONReadingMutableContainers 
                  error:&error]; 
       NSLog(@"Data: %@",jsonData); 
       NSLog(@"Success: %ld",(long)success); 

       if (success == 1) { 
        NSLog(@"Login SUCCESS"); 
       } 
       else {         
        NSString *error_msg = (NSString *) jsonData[@"error_message"]; 
        [self alertStatus:error_msg :@"Sign in Failed!" :0]; 
       } 
      } 
      else { 
       //if (error) NSLog(@"Error: %@", error); 
       [self alertStatus:@"Connection Failed" :@"Sign in Failed!" :0]; 
      } 
     } 
    } 
    @catch (NSException * e) 
    { 
     NSLog(@"Exception: %@", e); 
     [self alertStatus:@"Sign in Failed." :@"Error!" :0]; 
    } 
    if (success) 
    { 
     NSLog(@"THIS IS SUCCESS"); 
     // [self performSegueWithIdentifier:@"login_success" sender:self]; 
    } 
} 
+0

가 왜'을 application/x-www-form-urlencoded' 등의 콘텐츠를 보내는? 이것은 일반적으로 오류가 발생하기 쉽고 적절한 백분율 인코딩을 생략하여 매개 변수를 올바르게 전달하지 않았습니다. 여하튼 콘텐츠 유형으로 ** JSON **을 사용하십시오. – CouchDeveloper

답변

1

NSURL을 시도 * URL = [NSURL URLWithString : @ "http://www.site.com/test_json_link/?username= '사용자 이름'& 암호 = 'PASSWORD'"];

이제 웹 서버가 로그인 페이지로 리디렉션되지 않도록하기 위해. 위 URL을 처리 할 수있는 미들웨어를 만들었습니다. 내 사용자 정의 미들웨어는이 있습니다

if request.path != '/accounts/login/' and request.user.is_anonymous(): 
    url = request.path.split('/')[1] 
    if url == 'test_json': 
     username = request.GET['username'] 
     password = request.GET['password'] 
     user = authenticate(username = username, password = password) 
     if user is not None: 
      if user.is_active: 
       login(request, user) 
+0

이제 미들웨어 코드를 어디에 추가해야합니까? – iOSDeveloper

0

코드에 여러 가지 문제점이 있습니다.

접근 방법이 실패 할 가능성이있는 유일한 방법은 NSURLConnection 편리한 클래스 방법 sendSynchronousRequest:을 사용하는 것입니다. 요청에 인증이 필요한 경우 자격 증명을 URL에 전달해야합니다.

은 참조 : sendSynchronousRequest:returningResponse:error:

또한,이 요청을 취소하고 요청이 리디렉션되는 경우 적절한 조치를 취할 수있는 방법이 없습니다.

그래서 첫 번째 큰 변화는 NSURLConnection 대리자 접근 방식을 사용하거나 NSURLSessionNSURLSessionTask을 사용하는 것입니다. 그래서 당신에게 자신을 구현하기 위해 점프 시작을 제공해야합니다 그래서 몇 가지 솔루션이 있습니다.

그러나 권장되는 솔루션은 타사 라이브러리를 사용하는 것입니다.

관련 문제