2010-01-04 6 views
12

Für eine GET-Anfrage ich diese einfache Methode versucht haben:Wie füge ich eine POST-Anforderung in eine UIWebView

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

(Obwohl es nicht zu funktionieren scheint, wenn die Anforderung enthält hohe UTF-8-Zeichen .)

Ich möchte einen POST vom iPhone senden.

Dies gibt auch einen Überblick für sending POST/GET requests obwohl was ich wirklich tun möchte, ist die resultierende Webseite in UIWebView einbetten. Was wäre der beste Weg, um das zu umgehen?

Antwort

12

Sie können ein NSMutableURLRequest verwenden, die HTTP-Methode auf POST setzen und dann mit -loadRequest in Ihr UIWebView laden.

+0

Das ist besser. –

+0

Dies ist, was ich versucht habe (siehe den Link in der OP) und ich habe versucht, die ConnectionDidFinishLoading-Methode, um etwas wie [UiWebViewThing loadRequest: responseData] tun, aber es ist die falsche Art von Daten. Die Antwortdaten sind NSMutable, aber es muss NSUrlRequest sein - ich muss etwas offensichtliches falsch machen. – Gazzer

+1

Der obige Code verwendet eine NSURLRequest. Sie müssen ein NSMutableURLRequest verwenden. Verwechseln Sie nicht mit connectionDidFinishLoading, laden Sie es einfach mit -loadRequest in das WebView. –

2

Laden Sie mit loadHTMLString eine Seite in das UIWebView, das ein ausgeblendetes, bereits ausgefülltes Formular enthält, und führen Sie dann beim Laden eine JavaScript-Formulare [0] .submit() aus.

BEARBEITEN: Zuerst sammeln Sie die Eingabe in Variablen. Dann können Sie HTML wie folgt zusammensetzen:

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>"]; 

dann Sie es auf die WebView hinzufügen:

[myWebView loadHTMLString:s baseURL:nil]; 

Es wird die WebView laden Sie das Formular machen, dann legt sie sofort, so dass eine POST-Anforderung an einen Ort der Ausführung .com (Ihre URL wird variieren). Das Ergebnis wird in der WebView angezeigt.

Die Besonderheiten des Formulars sind bis zu Ihnen ...

+0

Ich verstehe das nicht wirklich. Ich versuche eine POST-Anfrage vom iPhone basierend auf einer Benutzereingabe zu senden und lasse den Server eine Seite erstellen, die wiederum im UIWebView erscheint. – Gazzer

+0

Dies gilt auch für 'WKWebView' (iOS8). Da gibt es vielleicht Bug und auch 'loadHTMLString' Methode funktioniert – Aznix

3

Sie so etwas wie ASIHTTPRequest verwenden können, die POST-Anforderung (Mit der Option, es zu tun asynchron) und laden Sie dann die Antwortzeichenfolge/Daten zu machen in die UIWebView. Sehen Sie sich this page unter dem Abschnitt Senden von Daten mit POST oder PUT Anfragen und dann auf die Erstellen Sie eine asynchrone Anfrage Abschnitt an der Spitze für Informationen zur Handhabung der Antwort Zeichenfolge/Daten.

Hoffe, dass hilft, sorry, wenn ich Ihre Frage missverstanden habe.

+0

Wie würden Sie die Antwort-String von einer ASIHttpRequest in die UIWebView laden? – MikeN

+0

@MikeN, '- (void) loadHTMLString: (NSString *) String baseURL: (NSURL *) baseURL' –

9

Vielen Dank für Ihre Antwort Seva. Ich habe eine Methode aus dem Code gemacht, hoffen, dass dies andere Leute :)

//------------------------------------------------------------------- 
// 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]; 
} 

hilft es

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

Das hat mein Problem gelöst, Vielen Dank. Ich möchte die Antwort verbessern, können Sie Wörterbuch statt Array verwenden, um zu vermeiden, Schlüssel-Wert-Paar. Mit diesem Beispielcode: 'für (NSString * Schlüssel in params) { NSString * hiddenParam = [NSString string: @ " \ n ", Schlüssel, [params objectForKey: key]]; [s appendString: hiddenParam]; } ' – krischu

5

(neu getesteten Code bearbeitet ursprüngliche Antwort enthalten) zu verwenden

Ich wollte nur meine Version dieser Anfrage einreichen. Ich habe ein Wörterbuch verwendet, um die Post-Parameter darzustellen.

Es ist ein Stück Code, ist aber einfach genug, um in eine Ansicht mit einem Webview zu fallen und für alle URL-Laden zu verwenden. Es wird nur POST, wenn Sie ein "postDictionary" senden. Andernfalls wird die URL, an die Sie sie gesendet haben, verwendet, um einfach Dinge zu holen.

- (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

POST URLRequest erstellen und verwenden Sie es 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

Hier ist eine Swift-Version von Seva Alekseyev Antwort zu füllen, die perfekt für mich gearbeitet. Danke für den netten Postkameraden! Der folgende Code ist in Swift 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) 
} 
Verwandte Themen