Подтвердить что ты не робот

Как вставить запрос POST в UIWebView

Для запроса GET я пробовал этот простой метод:

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

(Хотя он не работает, если запрос содержит высокие символы UTF-8.)

Я хочу отправить POST с iPhone.

Это также дает обзор отправки запросов POST/GET, хотя то, что я действительно хочу сделать, - это встраивание полученной веб-страницы в UIWebView. Каким будет лучший способ обойти это?

4b9b3361

Ответ 1

Вы можете использовать NSMutableURLRequest, установить HTTP-метод POST, а затем загрузить его в свой UIWebView с помощью -loadRequest.

Ответ 2

Спасибо за ответ Сева. Я сделал метод из вашего кода, надеюсь, что это поможет другим людям:)

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

Ответ 3

(отредактированный исходный ответ для включения недавно протестированного кода)

Я просто хотел отбросить свою версию этого запроса. Я использовал словарь для представления параметров сообщений.

Это кусок кода, но достаточно простой, чтобы перейти в представление с веб-просмотром и использовать для загрузки всех URL-адресов. Это будет только POST, если вы отправите "postDictionary". В противном случае он будет использовать URL-адрес, который вы отправили, чтобы просто ПОЛУЧИТЬ вещи.

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

Ответ 4

Вы можете использовать что-то вроде ASIHTTPRequest, чтобы сделать запрос POST (с возможностью сделать это асинхронно), а затем загрузить ответ строка/данные в UIWebView. Посмотрите эту страницу в разделе Отправка данных с помощью запросов POST или PUT, а затем посмотрите на Создание асинхронного запроса в верхней части страницы для получения информации о том, как обрабатывать строку ответа/данные.

Надеюсь, что это поможет, извините, если я неправильно понял ваш вопрос.

Ответ 5

Используя loadHTMLString, подайте страницу в UIWebView, у которой есть скрытая предварительно заполненная форма, затем сделайте на этой странице формы Javascript [0].submit() при загрузке.

EDIT: во-первых, вы вводите данные в переменные. Затем вы создаете HTML следующим образом:

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 your variable
[s appendString: @"</input></form></body></html>"];

Затем вы добавляете его в WebView:

[myWebView loadHTMLString:s baseURL:nil];

Он заставит WebView загрузить форму, а затем немедленно отправить ее, таким образом, выполнив запрос POST на someplace.com(ваш URL будет отличаться). Результат появится в WebView.

Специфика формы зависит от вас...

Ответ 6

Создайте POST 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];

Ответ 7

Вот быстрая версия ответа Севы Алексеева, которая отлично работала для меня. Спасибо за хороший пост! BTW следующий код находится в 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)
}