https

2011-01-06 26 views
19

adresindeki NSURLConnection eşzamanlı isteği https sunucusuna nasıl eşzamanlı çağrı yapabileceğimi söyleyen var mı? Aşağıdaki temsilci yöntemleri kullanarak https sunucusunda eşzamansız istek yapabilirim.https

- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace 

ve

- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge 

ama senkron yapmak gerekir. NSUrlConnection yılında

cevap

13
+ (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse **)response error:(NSError **)error 

https ile sadece iyi çalışması gerekir.

Kimlik bilgileri vermek isterseniz, URL'nin bir parçası olması gerekir: (https://username:[email protected]/api/user.json).

NSURLConnection temsilci sağlamanın bir yolu yoktur, bu nedenle standart dışı kimlik doğrulama işlemine ihtiyacınız varsa, bunu senkronize olmayan bir şekilde yapmanız gerekir.

+0

Adam, temsilci https sorununa yanıt vermek için bir örneğe bağımlı işlev çağrısı gerekiyor – LolaRun

+0

Teşekkür ederim :) Bu çok basit. –

24

// i öyle yapmıştım isteği

NSData *postData = [xmlText dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; 

**//Calculating length of request** 
NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]]; 

NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease]; 
[request setURL:[NSURL URLWithString:requestUrlString]]; 
[request setHTTPMethod:@"POST"]; 
[request setValue:postLength forHTTPHeaderField:@"Content-Length"]; 
[request setValue:@"application/xml" forHTTPHeaderField:@"Content-Type"]; 
[request setHTTPBody:postData]; 
NSURLResponse* response; 
NSError* error = nil; 

//Capturing server response 
NSData* result = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; 
+2

NSUTF8StringEncoding kullanımı, uluslararası karakter desteğine de sahip, örneğin: almanca, italyanca, vb. Varsa, tercih edilmelidir. Yukarıdaki yöntem kesinlikle mükemmeldir. –

+0

İfadeleri unutmayın, onlar da UTF8'e ihtiyaç duyar;) –

+0

Adam, temsilci https sorununa yanıt vermek için bir örneğe bağlı işlev çağrısı gerekir – LolaRun

6

Kodlama: Biz will beri yerine

[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error] 

I içeren sınıfına, esaslı aynı yöntem örneği yapılmış bir delege ihtiyacım var. Ve bunu tekil yapmayın, bu yüzden her bağlantının bağımsız değişkenleri vardır, çünkü eğer yapmazsak, ve diğeri bitmeden önce iki bağlantı çağrılırsa, o zaman alınan veri ve döngülerin ele geçirilmesi geri dönülemez şekilde iç içe geçecektir. .

[[ClassNameHere new] sendSynchronousRequest:request returningResponse:&response error:&error] 

Bu şekilde ben bir NSUrl bağlantısı oluşturmak ve bunu işleyebilir (zaman uyumlu bir şekilde, nasıl göreceksiniz) bu yüzden daha önce yazılı kodun herhangi bir değişiklik gerekmez.

- (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse *__strong*)response error:(NSError *__strong*)error 
{ 
    _finishedLoading=NO; 
    _receivedData=[NSMutableData new]; 
    _error=error; 
    _response=response; 

    NSURLConnection*con=[NSURLConnection connectionWithRequest:request delegate:self]; 
    [con start]; 
    CFRunLoopRun(); 

    return _receivedData; 
} 


- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace { 
    return [protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]; 
} 

- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge 
{ 
    //handle the challenge 
} 

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 
{ 
    *_response=response; 
} 

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 
{ 
    [_receivedData appendData:data]; 
} 

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error 
{ 
    *_error=error; 
    CFRunLoopStop(CFRunLoopGetCurrent()); 
} 

- (void)connectionDidFinishLoading:(NSURLConnection *)connection 
{ 
    CFRunLoopStop(CFRunLoopGetCurrent()); 
} 

hile CFRunLoopRun() ve CFRunLoopStop oldu (CFRunLoopGetCurrent()) Ben futur başkası yardımcı olur.

+2

Neden biri 250 yaşında bir soruya yanıt vereceğini sormayacağım, özellikle de bir;) Ama daha da önemlisi, ben istiyorum Kodunuzun doğru bir şekilde doğrulanmadığını ve güvenli olmadığını belirtmek için. Yani, bu sertifikalardan kurtulmak için sadece test kodu ise, bu tamam. Üretim için güvenlik riski. – CouchDeveloper

+0

Burada yaptığı gibi aynı sorunla karşı karşıya kaldım, daha sonra gelişimde bir https'e bağlanmak zorunda kaldım. Ve ben zaten senkronize istek kullanarak veri katmanı vardı. Ve sunucu zorluğuna uyum sağlamak için asenkronize etmek zorunda kaldık ve veri katmanını senkronize etmek çok zahmetli olurdu. Bu kod aslında kimlik doğrulamasını senkronize olmayan bir eşzamanlı :) şekilde ele alır. Bu nedenle, veri (model) tabakası, içinde hiç bir değişiklik olmaksızın, tam anlamıyla kusursuzdur. – LolaRun

+0

Şimdi zorlu kullanımın güvenliği ile ilgili. Bu makaleyi okudum: https://developer.apple.com/library/ios/#technotes/tn2232/_index.html#//apple_ref/doc/uid/DTS40012884-CH1-SECRESOLVINGFAILURES Ve benim durumum nerede değil Sunucum Onaylanmış Sertifikasına sahip, kendinden imzalanmış ve bu şekilde kalacak. Ve sunucu sertifikası için ana CA yok. Yani ya bu ya da sertifikayı indirin ve verileri karşılaştırın. Ve her iki yaklaşımın da aynı saldırıya karşı olduğunu düşünüyorum. Bu yüzden daha güvenli hale getirmek için sunucuyla çalışmalıyız. – LolaRun