2009-07-17 8 views
47

Có thể tải trang thông qua UIWebView với thông số POST không? Tôi có thể chỉ cần tải một biểu mẫu được nhúng với các tham số và điền chúng với javascript và buộc gửi, nhưng có cách nào sạch hơn và nhanh hơn không?Tải trang web qua UIWebView với thông số POST

Cảm ơn!

Trả lời

105

Tạo POST URLRequest và sử dụng nó để điền 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

Đã kiểm tra và hoạt động, cảm ơn! –

+0

hoạt động tốt. Chúc mừng –

+7

Tôi nghĩ rằng 'yêu cầu' sẽ được phát hành ở cuối. :) – Kjuly

7

Câu trả lời từ oxigen làm việc với một thay đổi nhỏ. Khi sử dụng:

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

Nó không làm việc, không phải như GET hoặc POST yêu cầu, khi thêm một dấu gạch chéo kết thúc vào theURL nó làm việc.

NSString *theURL = @"http://your_url.com/sub/"; 
+1

Đó là rất lẻ ... Tôi chắc chắn tôi đã thử nghiệm này trở lại tháng 5 năm 2012 và nó làm việc mà không có /. Nhưng nó chắc chắn cần/giờ, hoặc POST được biến đổi thành một GET một cách bí ẩn. Cảm ơn! – emrys57

9

Đối Swift

Dưới đây là một ví dụ cho cuộc gọi POST để xem web với kiểu nội dung x-www-form-urlencoded.

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) 

Bạn cần thay đổi postData cho các loại nội dung khác.

1

Đây là thay đổi câu trả lời của @ 2ank3th cho 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) 
0

cho nhanh 4

đầu tiên của nó tốt hơn để sử dụng phần mở rộng này:

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 
    } 

} 

phần mở rộng này là rất hữu ích để xử lý các thông số và giá trị của nó. giây:

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)