首页 > 解决方案 > 如何使用不同的对象发出这个 POST 请求?

问题描述

概述:

我正在尝试发出一个 POST 请求,我之前只使用字符串完成了该请求。这一次,我有几个变量,分别是:StringIntBool

错误:

Cannot assign value of type [String : Any] to type Data

导致错误的行:

request.httpBody = paramToSend

问题:

完整代码:

func sendComplimentAPI (message: String, recipient: Int, isPublic: Bool) {
    let url = URL(string: "https://complimentsapi.herokuapp.com/compliments/send/")
    let session = URLSession.shared
    let preferences = UserDefaults.standard
    let request = NSMutableURLRequest(url: url!)
    request.addValue("\(preferences.object(forKey: "token") as! String)", forHTTPHeaderField: "Authorization")
    request.httpMethod = "POST"
    
    let paramToSend = ["message":message,"recipient":recipient,"is_public":isPublic] as [String : Any] 
    request.httpBody = paramToSend
    
    let task = session.dataTask(with: request as URLRequest, completionHandler: {
        (data, response, error) in
        
        guard let _:Data = data else {return}
        let json:Any?
        do{json = try JSONSerialization.jsonObject(with: data!, options: [])}
        catch {return}
        
        guard let server_response = json as? NSDictionary else {return}
        
        if let session_data = server_response["id"] as? String {
            
            print("worked")
           //do something
            /*DispatchQueue.main.async (
                execute:
            )*/
        } else {
            print("error")
        }
    })
    
    task.resume()
    
}

编辑:

我已经尝试过这个新代码,但它仍然没有发布到服务器。我附上了我所做的更改,并为我所做的两张打印写了控制台显示的内容。

let paramToSend = ["message":writeTextField.text!,"recipient":1,"is_public":isPrivate] as [String : Any] //messageString + recipientString + isPublicString
            
            do {
                var serialized = try JSONSerialization.data(withJSONObject: paramToSend, options: .prettyPrinted)
                print(serialized)
                request.httpBody = serialized
                print(request.httpBody)
            } catch {
                print("found a problem")
            }

控制台返回(序列化,然后是 HTTP 正文): 113 字节 可选(113 字节)

这是可选的导致问题吗?我如何解决它?

标签: jsonswiftpost

解决方案


要转换DictionaryData,请使用JSONSerialization.data

解决方案:

JSONSerialization.data(withJSONObject: paramToSend, options: .prettyPrinted)

检查请求:

  • 打印请求,看看它是否符合您的期望

阅读回复:

//Check if there is any error (check if error != nil)

//Examine the response
let statusCode = (response as? HTTPURLResponse)?.statusCode
let statusCodeDescription = (response as? HTTPURLResponse)?.localizedString(forStatusCode: httpResponse.statusCode)

//Check Data
if let data = data {
    let dataString = String(data: data, encoding: String.Encoding.utf8)
}

推荐阅读