2010-01-04 11 views
12

GET अनुरोध के लिए मैं इस सरल विधि की कोशिश की है में एक पोस्ट अनुरोध डालूँ:कैसे मैं एक UIWebView

 NSString *urlAddress = @"http://example.com/"; 
     NSURL *url = [NSURL URLWithString:urlAddress]; 
     NSURLRequest *request = [NSURLRequest requestWithURL:url]; 
     [uiWebViewThingy loadRequest:request]; 

(हालांकि यह काम करने के लिए प्रतीत नहीं होता अनुरोध उच्च UTF-8 वर्ण हैं, तो ।)

मैं आईफोन से एक पोस्ट भेजना चाहता हूं।

यह sending POST/GET requests के लिए एक सिंहावलोकन भी देता है हालांकि मैं वास्तव में क्या करना चाहता हूं परिणामस्वरूप वेब पेज UIWebView में एम्बेड करना है। उसके आस-पास जाने का सबसे अच्छा तरीका क्या होगा?

उत्तर

12

आप एक एनएसएमयूटेबलURLआरक्वेट का उपयोग कर सकते हैं, HTTP विधि को POST पर सेट कर सकते हैं, और फिर इसे अपने UIWebView में -loadRequest का उपयोग करके लोड कर सकते हैं।

+0

यह बेहतर है। –

+0

यह वही है जो मैंने कोशिश की (ओपी में लिंक देखें) और मैंने कनेक्शन का उपयोग करने की कोशिश की है [uiWebViewThing loadRequest: respondData] लेकिन यह गलत प्रकार का डेटा है। प्रतिक्रिया डेटा एनएसएमयूटेबल है लेकिन इसे NSUrlRequest होने की आवश्यकता है - मुझे कुछ गलत गलत करना होगा। – Gazzer

+1

उपरोक्त कोड NSURLRequest का उपयोग करता है। आपको एक NSMutableURLRequest का उपयोग करने की आवश्यकता है। कनेक्शन के साथ गड़बड़ न करें DidFinishLoading, बस इसेलोड में लोड करें-loadRequest का उपयोग कर देखें। –

2

loadHTMLString का उपयोग करके, UIWebView पर एक पृष्ठ फ़ीड करें जिसमें एक छुपा, पूर्व-जनसंख्या वाला फॉर्म है, फिर उस पृष्ठ को लोड करने पर जावास्क्रिप्ट फ़ॉर्म [0] .submit() करें।

संपादित करें: सबसे पहले, आप चर में इनपुट एकत्र करते हैं। तो फिर तुम इस तरह एचटीएमएल रचना:

NSMutableString *s = [NSMutableString stringWithCapacity:0]; 
[s appendString: @"<html><body onload=\"document.forms[0].submit()\">" 
"<form method=\"post\" action=\"http://someplace.com/\">" 
"<input type=\"hidden\" name=\"param1\">"]; 
[s appendString: Param1Value]; //It's your variable 
[s appendString: @"</input></form></body></html>"]; 

तो फिर तुम WebView में जोड़ें:

[myWebView loadHTMLString:s baseURL:nil]; 

यह WebView प्रपत्र लोड कर देगा, तो तुरंत जमा करें, इस प्रकार किसी ऐसे स्थान पर करने के लिए एक पोस्ट अनुरोध को क्रियान्वित .com (आपका यूआरएल अलग-अलग होगा)। परिणाम वेब व्यू में दिखाई देगा।

प्रपत्र की बारीकियों आप पर निर्भर रहे हैं ...

+0

मुझे वास्तव में यह समझ में नहीं आता है। मैं उपयोगकर्ताओं के इनपुट के आधार पर आईफोन से एक POST अनुरोध भेजने की कोशिश कर रहा हूं और सर्वर एक पृष्ठ तैयार करता है जो बदले में UIWebView के अंदर दिखाई देगा। – Gazzer

+0

यह 'WKWebView' (iOS8) के लिए भी सही है। क्योंकि शायद बग है और 'loadHTMLString' विधि भी काम करता है – Aznix

3

आप पोस्ट अनुरोध (एसिंक्रोनस रूप यह कर के विकल्प के साथ) बनाने के लिए और फिर प्रतिक्रिया स्ट्रिंग/डेटा लोड ASIHTTPRequest की तरह कुछ का उपयोग कर सकते UIWebView में। को शीर्षक वाले अनुभाग के तहत के साथ डेटा भेजना और फिर पर देखें प्रतिक्रिया प्रतिक्रिया/डेटा को संभालने के तरीके के बारे में जानकारी के लिए शीर्ष पर एक अतुल्यकालिक अनुरोध अनुभाग बनाना।

आशा है कि अगर मैं आपके प्रश्न को गलत समझा तो क्षमा करें, क्षमा करें।

+0

आप UIWebView में ASIHttpRequest से प्रतिक्रिया स्ट्रिंग कैसे लोड करेंगे? – MikeN

+0

@ माइकन, '- (शून्य) लोड HTMLString: (NSString *) स्ट्रिंग baseURL: (NSURL *) baseURL' –

9

आपके लिए सेवा का उत्तर देने के लिए धन्यवाद। मैं अपने कोड के बाहर एक विधि कर दिया है, उम्मीद है कि इस अन्य लोगों :)

//------------------------------------------------------------------- 
// UIWebViewWithPost 
//  init a UIWebview With some post parameters 
//------------------------------------------------------------------- 
- (void)UIWebViewWithPost:(UIWebView *)uiWebView url:(NSString *)url params:(NSMutableArray *)params 
{ 
    NSMutableString *s = [NSMutableString stringWithCapacity:0]; 
    [s appendString: [NSString stringWithFormat:@"<html><body onload=\"document.forms[0].submit()\">" 
    "<form method=\"post\" action=\"%@\">", url]]; 
    if([params count] % 2 == 1) { NSLog(@"UIWebViewWithPost error: params don't seem right"); return; } 
    for (int i=0; i < [params count]/2; i++) { 
     [s appendString: [NSString stringWithFormat:@"<input type=\"hidden\" name=\"%@\" value=\"%@\" >\n", [params objectAtIndex:i*2], [params objectAtIndex:(i*2)+1]]]; 
    }  
    [s appendString: @"</input></form></body></html>"]; 
    //NSLog(@"%@", s); 
    [uiWebView loadHTMLString:s baseURL:nil]; 
} 

यह

NSMutableArray *webViewParams = [NSMutableArray arrayWithObjects: 
           @"paramName1", @"paramValue1", 
           @"paramName2", @"paramValue2", 
           @"paramName3", @"paramValue3", 
           nil]; 
[self UIWebViewWithPost:self.webView url:@"http://www.yourdomain.com" params:webViewParams]; 
+0

यह मेरी समस्या हल हो गया, बहुत बहुत धन्यवाद। मैं उत्तर में सुधार करना चाहता हूं, आप लापता कुंजी-मूल्य जोड़ी से बचने के लिए ऐरे के बजाय शब्दकोश का उपयोग कर सकते हैं। 'के लिए (NSString * पैरामीटर में कुंजी) { NSString * hiddenParam = [NSString stringWithFormat: इस नमूना कोड का प्रयोग करें @" \ n ", कुंजी, [पैराम्स ऑब्जेक्टफोरकी: कुंजी]]; [एस appendString: छुपा पैराम]; } ' – krischu

5

(संपादित मूल जवाब नव परीक्षण किया कोड शामिल करने के लिए) का उपयोग करने

में मदद करता है मैं सिर्फ इस अनुरोध के अपने संस्करण में ड्रॉप करना चाहता था। मैंने पोस्ट पैरामीटर का प्रतिनिधित्व करने के लिए एक शब्दकोश का उपयोग किया है।

यह कोड का एक हिस्सा है लेकिन वेबव्यू के साथ एक दृश्य में ड्रॉप करने और सभी यूआरएल लोडिंग के लिए उपयोग करने के लिए काफी आसान है। यदि आप "postDictionary" भेजते हैं तो यह केवल पोस्ट होगा। अन्यथा यह यूआरएल का उपयोग करेगा जिसे आपने इसे सिर्फ चीजों को प्राप्त करने के लिए भेजा था।

- (void) loadWebView:(UIWebView *)theWebView withURLString:(NSString *)urlString andPostDictionaryOrNil:(NSDictionary *)postDictionary { 
    NSURL *url       = [NSURL URLWithString:urlString]; 
    NSMutableURLRequest *request  = [NSMutableURLRequest requestWithURL:url 
              cachePolicy:NSURLRequestReloadIgnoringCacheData 
             timeoutInterval:60.0]; 


    // DATA TO POST 
    if(postDictionary) { 
     NSString *postString    = [self getFormDataString:postDictionary]; 
     NSData *postData     = [postString dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES]; 
     NSString *postLength    = [NSString stringWithFormat:@"%d", [postData length]]; 
     [request setHTTPMethod:@"POST"]; 
     [request setValue:postLength forHTTPHeaderField:@"Content-Length"]; 
     [request setValue:@"application/x-www-form-urlencoded; charset=utf-8" forHTTPHeaderField:@"Content-Type"]; 
     [request setHTTPBody:postData]; 
    } 

    [theWebView loadRequest:request]; 
} 
- (NSString *)getFormDataString:(NSDictionary*)dictionary { 
    if(! dictionary) { 
     return nil; 
    } 
    NSArray* keys        = [dictionary allKeys]; 
    NSMutableString* resultString    = [[NSMutableString alloc] init]; 
    for (int i = 0; i < [keys count]; i++) { 
     NSString *key       = [NSString stringWithFormat:@"%@", [keys objectAtIndex: i]]; 
     NSString *value       = [NSString stringWithFormat:@"%@", [dictionary valueForKey: [keys objectAtIndex: i]]]; 

     NSString *encodedKey     = [self escapeString:key]; 
     NSString *encodedValue     = [self escapeString:value]; 

     NSString *kvPair      = [NSString stringWithFormat:@"%@=%@", encodedKey, encodedValue]; 
     if(i > 0) { 
      [resultString appendString:@"&"]; 
     } 
     [resultString appendString:kvPair]; 
    } 
    return resultString; 
} 
- (NSString *)escapeString:(NSString *)string { 
    if(string == nil || [string isEqualToString:@""]) { 
     return @""; 
    } 
    NSString *outString  = [NSString stringWithString:string]; 
    outString     = [outString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 

    // BUG IN stringByAddingPercentEscapesUsingEncoding 
    // WE NEED TO DO several OURSELVES 
    outString     = [self replace:outString lookFor:@"&" replaceWith:@"%26"]; 
    outString     = [self replace:outString lookFor:@"?" replaceWith:@"%3F"]; 
    outString     = [self replace:outString lookFor:@"=" replaceWith:@"%3D"]; 
    outString     = [self replace:outString lookFor:@"+" replaceWith:@"%2B"]; 
    outString     = [self replace:outString lookFor:@";" replaceWith:@"%3B"]; 

    return outString; 
} 
- (NSString *)replace:(NSString *)originalString lookFor:(NSString *)find replaceWith:(NSString *)replaceWith { 
    if (! originalString || ! find) { 
     return originalString; 
    } 

    if(! replaceWith) { 
     replaceWith     = @""; 
    } 

    NSMutableString *mstring  = [NSMutableString stringWithString:originalString]; 
    NSRange wholeShebang   = NSMakeRange(0, [originalString length]); 

    [mstring replaceOccurrencesOfString: find 
          withString: replaceWith 
           options: 0 
            range: wholeShebang]; 

    return [NSString stringWithString: mstring]; 
} 
0

पोस्ट URLRequest बनाएँ और इसका इस्तेमाल WebView

NSURL *url = [NSURL URLWithString: @"http://your_url.com"]; 
NSString *body = [NSString stringWithFormat: @"arg1=%@&arg2=%@", @"val1",@"val2"]; 
NSMutableURLRequest *request = [[NSMutableURLRequest alloc]initWithURL: url]; 
[request setHTTPMethod: @"POST"]; 
[request setHTTPBody: [body dataUsingEncoding: NSUTF8StringEncoding]]; 
[webView loadRequest: request]; 
0

को भरने के लिए यहाँ सेवा Alekseyev के जवाब जो मेरे लिए पूरी तरह से काम किया है की एक स्विफ्ट संस्करण है। अच्छे पोस्ट साथी के लिए धन्यवाद! कोड के बाद बीटीडब्ल्यू स्विफ्ट 3.1 में है।

fileprivate func prepareDataAndSubmitForRepayment(parameters paramData: [String: Any]) { 
    var stringObj = String() 
    stringObj.append("<html><head></head>") 
    stringObj.append("<body onload=\"payment_form.submit()\">") 
    stringObj.append("<form id=\"payment_form\" action=\"\(urlString)\" method=\"post\">") //urlString is your server api string! 

    for object in paramData { //Extracting the parameters for request 
     stringObj.append("<input name=\"\(object.key)\" type=\"hidden\" value=\"\(object.value)\">") 
    } 

    stringObj.append("</form></body></html>") 
    debugPrint(stringObj) 
    webviewToLoadPage?.loadHTMLString(stringObj, baseURL: nil) 
}