2012-02-15 12 views
9

मेरे आईओएस ऐप में, मैं UIWebView और एक कस्टम प्रोटोकॉल (अपने स्वयं के NSRLProtocol कार्यान्वयन के साथ) का उपयोग कर रहा हूं। मुझे लगता है कि जब भी मैं एक यूआरएल लोड, मैं अपने UIWebView में कुछ इस तरह से लोड सुनिश्चित करने के बारे में काफी सावधान किया गया है:UIWebView और POST अनुरोधों के साथ एक कस्टम NSURLProtocol का उपयोग करना

myprotocol: // MyServer/mypath

और मेरे NSURLProtocol कार्यान्वयन में, मैं एक परिवर्तनशील ले NSURLRequest की प्रतिलिपि, URL को http में कनवर्ट करें: और इसे मेरे सर्वर पर भेजें।

सब कुछ HTTP जीईटी अनुरोधों के लिए काम करता है। मुझे सामना करने वाली समस्या POST अनुरोधों के साथ है। ऐसा लगता है कि UIWebView HTTPBody में फ़ॉर्म डेटा को ठीक से एन्कोड नहीं करता है अगर अनुरोध मेरे कस्टम प्रोटोकॉल का उपयोग करता है।

एक काम-आसपास, क्योंकि मैं अपने सर्वर अनुरोधों के लिए HTTPS का उपयोग कर रहा हूं, यह है कि मैं अपने प्रोटोकॉल हैंडलर को http: इंटरप्रोटोकॉल के बजाय http को अवरुद्ध करने के लिए पंजीकृत करता हूं: और मैं सभी कॉल को https में परिवर्तित कर सकता हूं: यह अन्य प्रश्न, here, मुझे उस समाधान की ओर इशारा किया:

लेकिन मुझे आश्चर्य है कि क्या मैं चाहता हूं कि पूरा करने का कोई वैकल्पिक और/या बेहतर तरीका है।

उत्तर

5
इसके बजाय पोस्ट अनुरोध का उपयोग करने की कोशिश कर के

, एक काम के आसपास के रूप में अनुरोध क्वेरी स्ट्रिंग का उपयोग myprotocol:// यूआरएल के लिए प्राप्त अनुरोधों का उपयोग जारी रखने के लिए, लेकिन अपने सर्वर पर एक http://और पोस्ट अनुरोध करने के लिए अपने NSURLProtocol कार्यान्वयन में उन्हें बदलने के लिए है पोस्ट का शरीर

बड़ी मात्रा में डेटा भेजने के लिए जीईटी अनुरोधों का उपयोग करने की चिंता यह है कि अनुरोध श्रृंखला के साथ कहीं भी, अनुरोध लाइन काटा जा सकता है। हालांकि, यह स्थानीय रूप से लागू प्रोटोकॉल के साथ एक समस्या नहीं प्रतीत होता है।

मैं प्रयोग करने के लिए एक छोटी Cordova परीक्षण ऐप को लिखा था और मैंने पाया कि मैं HTTP अनुरोध गूंज सेवा http://http-echo.jgate.de/

यहाँ मेरी startLoading कार्यान्वयन है करने के लिए मुसीबत के बिना डेटा का 1 MiB से कुछ ज्यादा के माध्यम से भेजने के लिए सक्षम था:

- (void)startLoading { 
    NSURL *url = [[self request] URL]; 
    NSString *query = [url query]; 
    // Create a copy of `url` without the query string. 
    url = [[[NSURL alloc] initWithScheme:@"http" host:@"http-echo.jgate.de" path:[url path]] autorelease]; 
    NSMutableURLRequest *newRequest = [NSMutableURLRequest requestWithURL:url]; 
    [newRequest setHTTPMethod:@"POST"]; 
    [newRequest setAllHTTPHeaderFields:[[self request] allHTTPHeaderFields]]; 
    [newRequest addValue:@"close" forHTTPHeaderField:@"Connection"]; 
    [newRequest addValue:@"application/x-www-form-urlencoded;charset=UTF-8" forHTTPHeaderField:@"Content-Type"]; 
    [newRequest setHTTPBody:[query dataUsingEncoding:NSUTF8StringEncoding]]; 
    urlConnection = [[NSURLConnection alloc] initWithRequest:newRequest delegate:self]; 
    if (urlConnection) { 
     receivedData = [[NSMutableData data] retain]; 
    } 
} 

मैं तो उचित NSURLProtocolClient विधि को अग्रेषित करने के लिए NSURLConnection प्रोटोकॉल तरीकों को लागू किया है, लेकिन Transfer-Encoding:chunked के मामले में प्रतिक्रिया डेटा का निर्माण (के रूप में http://http-echo.jgate.de/ से प्रतिक्रिया के लिए मामला है)।

+0

अच्छा सुझाव। क्षमा करें, मैंने आपकी प्रतिक्रिया पहले नहीं देखी थी। – bcholmes

2

दुर्भाग्यवश ऐसा लगता है कि http: और https: योजना अनुरोधों को फाउंडेशन फ्रेमवर्क द्वारा अन्य (कस्टम सहित) योजनाओं की तुलना में थोड़ा अलग तरीके से संभाला जाता है। जाहिर है HTTPBody और HTTPBodyStream प्रासंगिक NSURLRequest पर कॉल हमेशा पूर्व के लिए nil देता है। यह तय किया गया है कि पहले से ही [NSURLProtocol canInitWithRequest] की पूर्व कॉल है इसलिए कस्टम NSURLProtocol कार्यान्वयन का कोई प्रभाव नहीं है (यह बहुत देर हो चुकी है)।

ऐसा लगता है कि अलग-अलग NSURLRequest कक्षा http: और https: के लिए 'डिफ़ॉल्ट' की तुलना में उपयोग की जाती है। इस कक्षा के डिफ़ॉल्ट GnuStep कार्यान्वयन हमेशाnilHTTPBody और HTTPBodyStream कॉल से लौटाता है। इसलिए विशेष कार्यान्वयन (उदाहरण के लिए फोनगैप के तहत, फाउंडेशन फ्रेमवर्क का संभावित हिस्सा) NSURLRequest चुनें- NSURLProtocol के साथ पूर्व परामर्श योजना के आधार पर कक्षा का प्रकार चुनें।कस्टम योजनाओं के लिए, आपको NSURLRequest मिलते हैं जो HTTPBody और HTTPBodyStream दोनों के लिए nil लौटाता है जो कस्टम यूआरआई योजना हैंडलर में POST विधि (और शरीर के साथ अन्य विधियों) का प्रभावी ढंग से उपयोग अक्षम करता है।

शायद NSURLRequest कक्षा के निर्णय को प्रभावित करने का तरीका वास्तव में उपयोग किया जाता है लेकिन यह वर्तमान में मेरे लिए अज्ञात है।

कामकाज के रूप में, आप अभी भी http: या https: योजना का उपयोग कर सकते हैं और अन्य मानदंडों (जैसे होस्ट नाम) के आधार पर [NSURLProtocol canInitWithRequest] में निर्णय ले सकते हैं।

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^