https

2011-01-06 7 views
19

पर NSURLConnection सिंक्रोनस अनुरोध क्या कोई मुझे बता सकता है कि मैं https सर्वर पर सिंक्रोनस कॉल कैसे कर सकता हूं? मैं निम्नलिखित प्रतिनिधि तरीकों का उपयोग कर https सर्वर पर एसिंक्रोनस अनुरोध करने में सक्षम हूं।https

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

और

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

लेकिन मैं तुल्यकालिक करने की ज़रूरत है।

उत्तर

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

NSUrlConnection में https के साथ ठीक काम करना चाहिए।

यदि आप प्रमाण-पत्र प्रदान करना चाहते हैं, तो उन्हें यूआरएल का हिस्सा बनने की आवश्यकता है: (https://username:[email protected]/api/user.json)।

NSURLConnection प्रतिनिधि प्रदान करने का कोई तरीका नहीं है, इसलिए यदि आपको कुछ गैर-मानक प्रमाणीकरण हैंडलिंग की आवश्यकता है तो आपको इसे असंकालिक रूप से करने की आवश्यकता होगी।

+0

प्रतिनिधि को https चुनौती – LolaRun

+0

का जवाब देने के लिए प्रतिनिधि को प्रदान करने के लिए व्यक्ति को एक आवृत्ति निर्भर फ़ंक्शन कॉल की आवश्यकता है :) यह बहुत आसान है। –

24

// अनुरोध

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 का उपयोग तब किया जाना चाहिए जब डेटा है जिसमें अंतरराष्ट्रीय चरित्र समर्थन भी है, उदाहरण के लिए: जर्मन, इतालवी, आदि .. उपर्युक्त विधि बिल्कुल सही है .. –

+0

इमोटिकॉन्स को न भूलें, उन्हें यूटीएफ 8 भी चाहिए;) –

+0

https चुनौती को प्रतिक्रिया देने के लिए प्रतिनिधि को प्रदान करने के लिए व्यक्ति को एक आवृत्ति निर्भर फ़ंक्शन कॉल की आवश्यकता होती है – LolaRun

6

है कि कैसे मैं यह किया एन्कोडिंग:, मैं आधारित एक ही विधि का उदाहरण दिया, जिसमें वर्ग पर

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

के बजाय के बाद से हम करेंगे एक प्रतिनिधि की जरूरत है। और इसे सिंगलटन न बनाएं, इसलिए प्रत्येक कनेक्शन में इसके स्वतंत्र चर होते हैं, क्योंकि, यदि हम नहीं करते हैं, और दूसरे कनेक्शन से पहले दो कनेक्शन बुलाए जाते हैं, तो प्राप्त डेटा और लूपों के हैंडलिंग को अप्रत्याशित रूप से अंतःस्थापित किया जाएगा ।

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

इस तरह मैं एक NSUrl कनेक्शन बनाने और इसे संभाल कर सकते हैं (एक तुल्यकालिक रास्ते में, हम कैसे देखेंगे) तो मैं पहले से लिखा कोड के किसी भी बदलने की जरूरत नहीं है।

- (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()); 
} 

चाल CFRunLoopRun() और CFRunLoopStop में था (CFRunLoopGetCurrent()) मुझे आशा है कि यह futur में किसी और में मदद करता है।

+2

मैं नहीं पूछूंगा कि कोई 250 वर्षीय प्रश्न का उत्तर क्यों देगा, और विशेष रूप से वह एक;) लेकिन अधिक महत्वपूर्ण बात यह है कि मैं चाहूंगा यह उल्लेख करने के लिए कि आपका कोड ठीक से प्रमाणीकृत नहीं है, और सुरक्षित नहीं है। इसलिए, अगर प्रमाण पत्र से छुटकारा पाने के लिए यह सिर्फ टेस्ट कोड है, तो यह ठीक है। उत्पादन के लिए, यह एक सुरक्षा जोखिम है। – CouchDeveloper

+0

यहां मुझे उसी समस्या का सामना करना पड़ा जैसा उसने किया था, मुझे बाद में विकास में एक https से कनेक्ट करना पड़ा। और मेरे पास सिंक्रोनस अनुरोध का उपयोग कर डेटा परत पहले से ही थी। और सर्वर चुनौती को अनुकूलित करने के लिए हमें इसे अतुल्यकालिक बनाना था, और डेटा परत को सिंक्रोनस में रीमेक करना बोझिल होता। यह कोड वास्तव में एक तुल्यकालिक एसिंक्रोनस :) तरीके में प्रमाणीकरण को संभालता है। इस प्रकार डेटा (मॉडल) परत अभी भी पूरी तरह से बरकरार है, इसमें कोई संशोधन नहीं है। – LolaRun

+0

अब चुनौती संभालने की सुरक्षा से संबंधित है। मैंने इस आर्टिकल को पढ़ा: https://developer.apple.com/library/ios/#technotes/tn2232/_index.html#//apple_ref/doc/uid/DTS40012884-CH1-SECRESOLVINGFAILURES और मेरा मामला नहीं है मेरे सर्वर में एक सत्यापित प्रमाणपत्र है, यह स्वयं हस्ताक्षरित था, और यह इस तरह से रहेगा। और सर्वर प्रमाण पत्र के लिए कोई पैरेंट सीए नहीं। तो या तो यह, या प्रमाणपत्र डाउनलोड करें और डेटा की तुलना करें। और मुझे लगता है कि दोनों दृष्टिकोण, हमले की एक ही भेद्यता है। तो हमें अधिक सुरक्षित बनाने के लिए सर्वर के साथ काम करना होगा। – LolaRun