【问题标题】:Unable to post parameters in post request ios swift无法在发布请求ios swift中发布参数
【发布时间】:2019-09-17 23:18:48
【问题描述】:

我正在尝试将这些参数作为发布请求发送到 URL,但未发送参数。我不知道是否是URLSession 配置问题。任何人都可以检查并解决问题吗?

import UIKit

let json: [String: Any] = [
    "set_id" : "20",
    "user_id" :  "30",
    "type" : "contact",
    "contact_name" : "shinto"
]

let jsonData = try? JSONSerialization.data(withJSONObject: json)

var str = String(data: jsonData!, encoding: .utf8)

let url = URL(string: "****.php")!
var request = URLRequest(url: url)

request.httpMethod = "Post"
request.httpBody = str!.data(using: .utf8)

let session = URLSession(configuration: .default)
let task = session.dataTask(with: request) {

  (data, response, error) in
    if let data = data {
      if let postResponse = String(data: data, encoding: .utf8) {
        print(postResponse)
      }
    }

}
task.resume()

【问题讨论】:

  • request.httpBody = str!.data(using: .utf8) 为什么不直接做request.httpBody = jsonData?现在你怎么知道“参数没有被发送”?另外,request.httpMethod = "Post" 使用 POST(全部大写?)
  • @Larme 不工作兄弟
  • 让 jsonData = 试试? JSONSerialization.data(withJSONObject: userID, options:.prettyPrinted) 作为数据。现在设置 request.httpBody = jsonData
  • 你在标题中提到Content-Type 为json 吗?
  • 是的,我添加了一些自定义字段 var urlRequest = URLRequest(url: getOEMurl!) urlRequest.setValue("application/json", forHTTPHeaderField: "Accept") urlRequest.setValue("application/json", forHTTPHeaderField: "Content-Type") urlRequest.setValue(String(format:"%f",(userIdJson?.count)!), forHTTPHeaderField: "Content-Length")

标签: ios swift xcode urlsession


【解决方案1】:

检查一下:

      func post method(){
      let headers = [
        "Content-Type": "application/json",
        "cache-control": "no-cache"]


    let parameters = ["set_id" : "20",
                      "user_id" :  "30",
                      "type" : "contact",
                      "contact_name" : "shinto"] as [String : Any]



    let postData = try? JSONSerialization.data(withJSONObject: parameters, options: [])

    let url = URL(string: "****.php")!
    var request = URLRequest(url: url)

    request.httpMethod = "POST"
    request.allHTTPHeaderFields = headers
    request.httpBody = postData as! Data

    let session = URLSession.shared
    let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
        if (error != nil) {
            print(error)
        }
        guard let httpresponse = response as? HTTPURLResponse,
            (200...299).contains(httpresponse.statusCode) else {
                print ("server error")
                return
        }


        if let mimeType = response?.mimeType,
            mimeType == "application/json",
            let data = data,
            let dataString = String(data: data, encoding: .utf8) {
            print ("got data: \(dataString)")

     }
     }
    })

    dataTask.resume()

}

【讨论】:

    【解决方案2】:

    我使用名为 RequestBin 的在线服务来检查您的请求,并且数据似乎已正确发送。我只做了评论中已经提到的小修改。

    这是生成的代码:

    let json: [String: Any] = [
        "set_id" : "20",
        "user_id" :  "30",
        "type" : "contact",
        "contact_name" : "shinto"
    ]
    let jsonData = try! JSONSerialization.data(withJSONObject: json)
    
    let url = URL(string: "http://requestbin.fullcontact.com/***")! // Was "using"
    var request = URLRequest(url: url)
    
    request.httpMethod = "POST" // Was "Post"
    request.httpBody = jsonData // Was utf8 string representation
    
    let session = URLSession(configuration: .default)
    let task = session.dataTask(with: request) {
        (data, response, error) in
        if let data = data {
            if let postResponse = String(data: data, encoding: .utf8) {
                print(postResponse)
            }
        }
    
    }
    task.resume()
    

    您可以使用this service 检查检查结果。您只需创建一个新 URL 并在您的请求中使用它。成功发送请求后,您只需重新加载页面以检查您的请求。

    请注意,这些是“http”请求,因此您需要允许 arbitrary loads

    【讨论】:

      【解决方案3】:

      您可以像下面这样设置您的请求,并根据您的需要更改内容类型

      import UIKit    
      let json: [String: Any]? = [
          "set_id" : "20",
          "user_id" :  "30",
          "type" : "contact",
          "contact_name" : "shinto"
      ]
      let url = URL(string: "****.php")!
      var request = URLRequest(url: url)
      request.setValue("application/json", forHTTPHeaderField: "Content-Type")
      request.httpMethod = "POST"
      if let parameters = json
      {
          self.makeParamterString(request: request, parameterDic: parameters)
      }
      
      let session = URLSession(configuration: .default)
      let task = session.dataTask(with: request) {
      
        (data, response, error) in
          if let data = data {
            if let postResponse = String(data: data, encoding: .utf8) {
              print(postResponse)
            }
          }
      
      }
      task.resume()
           static  func makeParamterString(request:NSMutableURLRequest, parameterDic:[String:AnyObject])
          {
              let _ =  NSCharacterSet(charactersIn:"=\"#%/<>?@\\^`{|}").inverted
              var dataString = String()
              for (key, value) in parameterDic {
                  dataString = (dataString as String) + ("&\(key.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)!)=\(value)")
              }
              dataString = dataString.addingPercentEncoding(withAllowedCharacters: NSCharacterSet.urlQueryAllowed)!
              request.httpBody = dataString.data(using: String.Encoding.utf8)
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-24
        • 1970-01-01
        相关资源
        最近更新 更多