2010-01-04 31 views
12

Per una richiesta GET Ho provato questo metodo semplice:Come posso inserire una richiesta POST in un UIWebView

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

(Anche se non sembra funzionare, se la richiesta contiene caratteri high UTF-8 .)

Voglio inviare un POST da iPhone.

Ciò fornisce anche una panoramica per sending POST/GET requests anche se quello che voglio veramente è incorporare la pagina Web risultante in UIWebView. Quale sarebbe il modo migliore per aggirare questo?

risposta

12

È possibile utilizzare un NSMutableURLRequest, impostare il metodo HTTP su POST e quindi caricarlo in UIWebView utilizzando -loadRequest.

+0

Questo è meglio. –

+0

Questo è quello che ho provato (vedi il link nell'OP) e ho provato ad usare il metodo connectionDidFinishLoading per fare qualcosa come [uiWebViewThing loadRequest: responseData] ma è il tipo di dati sbagliato. I dati di risposta sono NSMutable ma deve essere NSUrlRequest - Devo fare qualcosa di ovvio. – Gazzer

+1

Il codice sopra utilizza NSURLRequest. È necessario utilizzare NSMutableURLRequest. Non scherzare con connectionDidFinishLoading, basta caricarlo nella webView usando -loadRequest. –

2

Utilizzando loadHTMLString, alimentare una pagina a UIWebView che ha un modulo nascosto, pre-compilato, quindi fare in modo che quella pagina faccia un modulo JavaScript [0] .submit() al caricamento.

MODIFICA: innanzitutto, si raccoglie l'input in variabili. Poi componete HTML come questo:

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

quindi si aggiunge alla WebView:

[myWebView loadHTMLString:s baseURL:nil]; 

Si farà il WebView caricare il modulo, poi subito lo presenta, eseguendo così una richiesta POST a un posto .com (il tuo URL varierà). Il risultato verrà visualizzato in WebView.

Le specifiche del modulo sono da te ...

+0

Io non capisco questo. Sto provando a inviare una richiesta POST da parte dell'iPhone in base all'input di un utente e fare in modo che il server generi una pagina che a sua volta apparirà all'interno di UIWebView. – Gazzer

+0

Questo vale anche per 'WKWebView' (iOS8). Perché forse c'è un bug e anche il metodo 'loadHTMLString' funziona – Aznix

3

Si può usare qualcosa di simile ASIHTTPRequest per fare la richiesta POST (Con l'opzione di farlo in modo asincrono) e quindi caricare la stringa di risposta/dati in UIWebView. Guardate this page nella sezione intitolata Invio di dati con POST o PUT richieste e poi guardare il Creazione di una sezione asincrono richiesta in alto per informazioni su come gestire la stringa di risposta/dati.

Spero che questo aiuti, scusa se ho frainteso la tua domanda.

+0

Come caricheresti la stringa di risposta da un ASIHttpRequest in UIWebView? – MikeN

+0

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

9

Grazie per la risposta Seva. Ho fatto un metodo di fuori del codice, spero che questo aiuta altre persone :)

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

usarlo

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

Questo ha risolto il mio problema, grazie mille. Desidero migliorare la risposta, è possibile utilizzare Dizionario anziché Array per evitare la mancata coppia chiave-valore. Utilizzare questo codice di esempio: 'for (NSString * chiave params) { NSString * hiddenParam = [NSString stringWithFormat: @ " \ n ", chiave, [params objectForKey: key]]; [s appendString: hiddenParam]; } ' – krischu

5

(risposta originale a cura di includere codice appena testato)

Volevo solo inserire la mia versione di questa richiesta. Ho usato un dizionario per rappresentare i parametri del post.

È una porzione di codice, ma è abbastanza semplice da essere inserito in una vista con una visualizzazione Web e utilizzato per il caricamento di tutti gli URL. Sarà POST solo se invii un "postDictionary". Altrimenti userà l'url che hai inviato per ottenere solo cose.

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

Creare POST URLRequest e utilizzare per riempire 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

Ecco una versione Swift della risposta di Seva Alekseyev che ha funzionato perfettamente per me. Grazie per il simpatico compagno di posta! Il seguente codice BTW si trova 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) 
} 
Problemi correlati