Загрузка веб-страницы через UIWebView с параметрами POST

Можно ли загрузить страницу через UIWebView с параметрами POST? Я, вероятно, могу просто загрузить встроенную форму с параметрами и заполнить их с помощью javascript и принудительно отправить, но есть ли более чистый и быстрый способ?

Спасибо!


person Community    schedule 17.07.2009    source источник


Ответы (5)


Создайте 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];
person oxigen    schedule 17.07.2009
comment
Я думаю, что request следует выпустить в конце. :) - person Kjuly; 27.03.2012

Ниже приведены примеры вызова POST для веб-просмотра с типом содержимого x-www-form-urlencoded.

Вам необходимо изменить postData для других типов контента.

Для Swift 3

let url = NSURL (string: "https://www.google.com")
let request = NSMutableURLRequest(URL: url!)
request.HTTPMethod = "POST"
request.addValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")

let post: String = "sourceId=44574fdsf01e-e4da-4e8c-a897-17722d00e1fe&sourceType=abc"
let postData: NSData = post.dataUsingEncoding(NSASCIIStringEncoding, allowLossyConversion: true)!

request.HTTPBody = postData
webView.loadRequest(request)

Для Swift 4

let url = URL (string: "let url = NSURL (string: "https://www.google.com")
let request = NSMutableURLRequest(url: url!)
request.httpMethod = "POST"
request.addValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")

let post: String = "sourceId=44574fdsf01e-e4da-4e8c-a897-17722d00e1fe&sourceType=abc"
let postData: Data = post.data(using: String.Encoding.ascii, allowLossyConversion: true)!

request.httpBody = postData
webView.load(request as URLRequest)
person 2ank3th    schedule 17.02.2016

Ответ от oxigen сработал с небольшими изменениями. Когда используешь:

NSString *theURL = @"http://your_url.com/sub";
...//and later
[request setURL:[NSURL URLWithString:theURL]];

Это не сработало ни в качестве запросов GET, ни в качестве POST, при добавлении конечной косой черты к theURL это сработало.

NSString *theURL = @"http://your_url.com/sub/";
person tomg    schedule 30.10.2012
comment
Это очень странно ... Я уверен, что тестировал это еще в мае 2012 года, и он работал без /. Но ему определенно нужен / сейчас, иначе POST таинственным образом преобразуется в GET. Спасибо! - person emrys57; 08.04.2013

Это модифицированный ответ @ 2ank3th для Swift 3:

let url = NSURL (string: "https://www.google.com")
let request = NSMutableURLRequest(url: url! as URL)
request.httpMethod = "POST"
request.addValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")

let post: String = "sourceId=44574fdsf01e-e4da-4e8c-a897-17722d00e1fe&sourceType=abc"
let postData: NSData = post.data(using: String.Encoding.ascii, allowLossyConversion: true)! as NSData

request.httpBody = postData as Data
webView.loadRequest(request as URLRequest)
person Paraneetharan Saravanaperumal    schedule 16.05.2017

для swift 4

сначала лучше использовать это расширение:

extension URL{
    func withQueries(_ queries:[String:String]) -> URL? {
        var components = URLComponents(url: self, resolvingAgainstBaseURL: true)
        components?.queryItems = queries.flatMap{URLQueryItem(name: $0.0, value: $0.1)}
        return components?.url
    }

    func justQueries(_ queries:[String:String]) -> URL? {
        var components = URLComponents(url: self, resolvingAgainstBaseURL: true)
        components?.queryItems = queries.flatMap{URLQueryItem(name: $0.0, value: $0.1)}
        return components?.url
    }

}

это расширение очень полезно для обработки параметров и их значений. второй:

let urlstring = "https://yourdomain.com"
        let url = URL(string: urlstring)!
        let request = NSMutableURLRequest(url: url as URL)
        request.httpMethod = "POST"
        request.addValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
        let query :[String:String] = ["username":"admin","password":"111"]
        let baseurl = URL(string:urlstring)!
        let postString = (baseurl.withQueries(query)!).query
        request.httpBody = postString?.data(using: .utf8)
        webview.load(request as URLRequest)
person iman kazemayni    schedule 28.02.2018