首页 > 解决方案 > HTTP POST html 数据有 0 个字节

问题描述

我正在创建一个看起来像这样的 HTML 字符串。

<form method='POST' action='https://secure.paygate.co.za/payweb3/process.trans'>
<input type='hidden' name='PAY_REQUEST_ID' value='653B3F12-3A86-EFE8-C96D-F1DD73B1E95F'></input><input type='hidden' name='CHECKSUM' value='F765B8AEA5F0D1067E1513832035BE76'></input></form>

我已经使用https://www.codepunker.com/tools/http-requests测试了 URL 和参数,我得到了成功的 HTML 响应,但是由于某种原因,我在使用下面的代码 http post 时得到了一个错误的 HTML 响应.

let url = URL(string: self.dpoURL)!
var request = URLRequest(url: url)
request.httpMethod  = "POST"
request.httpBody    = postFormHtml.data(using: .utf8)
                
let session = URLSession.shared
let task = session.dataTask(with: request) { (data, response, error) in
  if error != nil {
    // Handle HTTP request error
  } else if let data = data {
    DispatchQueue.main.async{ [self] in
      // Handle HTTP request response
      self.resultFormHtml = String(data: data, encoding: .utf8)!
    }
  } else {
    // Handle unexpected error
  }
}
task.resume()

我有一种感觉,问题是当我将 HTML 字符串转换为 UTF8 时,postFormHtml.data(using: .utf8) 因为如果我打印我得到 0 字节。我还进行了以下测试并得到一个空白文本框。

let testHTML = postFormHtml.data(using: .utf8) 
viewHTML.text = String(decoding: testHTML, as: UTF8.self)

将我的 HTML 字符串转换为数据时我做错了什么?

标签: swift

解决方案


最终,Postman 给出了答案。我在正文中添加了参数,而不是参数,然后使用右上角的按钮 CODE 为我生成了代码。

                        var semaphore = DispatchSemaphore (value: 0)

                        var request = URLRequest(url: URL(string: self.dpoURL)!,timeoutInterval: Double.infinity)
                        request.addValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
                        request.addValue("no-cache", forHTTPHeaderField: "Cache-Control")
                        request.addValue("paygate_payweb3=b09rqdgclqfi4gf7h261j79uke", forHTTPHeaderField: "Cookie")

                        request.httpMethod = "POST"
                        request.httpBody   = postFormHtml

                        let task = URLSession.shared.dataTask(with: request) { data, response, error in
                          guard let data = data else {
                            print(String(describing: error))
                            semaphore.signal()
                            return
                          }
                            self.resultFormHtml = String(data: data, encoding: .utf8)!
                          semaphore.signal()
                        }

                        task.resume()
                        semaphore.wait()

推荐阅读