Ios 如何在编码结构中发布数据?

Ios 如何在编码结构中发布数据?,ios,swift,Ios,Swift,我使用了两个模型GET和POST,它们是可编码和可解码的 使用下面的代码,我可以在get模型中获取数据,但无法使用post模型发布数据 请指导我如何使用post模型发布数据 let url = URL(string: "<YOUR URL HERE>") let config = URLSessionConfiguration.default config.httpAdditionalHeaders = [ "Accept" : "application/json", "Conten

我使用了两个模型GET和POST,它们是可编码和可解码的

使用下面的代码,我可以在get模型中获取数据,但无法使用post模型发布数据

请指导我如何使用post模型发布数据

let url = URL(string: "<YOUR URL HERE>")
let config = URLSessionConfiguration.default
config.httpAdditionalHeaders = [
"Accept" : "application/json",
"Content-Type" : "application/x-www-form-urlencoded"
]

let session = URLSession(configuration: config)

var request = URLRequest(url: url!)
request.encodeParameters(parameters: ["username": username, "password": 
password])

let task = session.dataTask(with: request) { data, response, error in
guard let data = data else { return }
  do {
      let sentPost = try JSONDecoder().decode(Get.self, from: data)
      print(sentPost)
  } catch {}
}
task.resume()
URL请求的扩展

extension URLRequest {

private func percentEscapeString(_ string: String) -> String {
    var characterSet = CharacterSet.alphanumerics
    characterSet.insert(charactersIn: "-._* ")

    return string
        .addingPercentEncoding(withAllowedCharacters: characterSet)!
        .replacingOccurrences(of: " ", with: "+")
        .replacingOccurrences(of: " ", with: "+", options: [], range: nil)
}

mutating func encodeParameters(parameters: [String : String]) {
    httpMethod = "POST"

    let parameterArray = parameters.map { (arg) -> String in
        let (key, value) = arg
        return "\(key)=\(self.percentEscapeString(value))"
    }

    httpBody = parameterArray.joined(separator: "&").data(using: String.Encoding.utf8)
  }
}

您不需要创建另一个字符串,然后再创建数据。这将由
Codable
协议和您的
jsonecoder
处理。您需要使用
jsonecoder
对帖子类型进行编码,并将数据提供给
请求。httpBody

试试这个:

let url = URL(string: "<YOUR URL HERE>")
let config = URLSessionConfiguration.default
config.httpAdditionalHeaders = [
    "Accept" : "application/json",
    "Content-Type" : "application/x-www-form-urlencoded"
]

do {
    let aPost = Post(username: "username", password: "password")
    let encoder = JSONEncoder()
    let encodedPost = try encoder.encode(aPost)

    let session = URLSession(configuration: config)
    var request = URLRequest(url: url!)
    request.httpMethod = "POST"
    request.httpBody = encodedPost

    let task = session.dataTask(with: request) { data, response, error in
        do {
            let sentPost = try JSONDecoder().decode(Get.self, from: data)
            print(sentPost)
        } catch { 
            print(error.localizedDescription)
        }
    }
    task.resume()
} catch {
    print(error.localizedDescription)
}
let url=url(字符串:“”)
让config=URLSessionConfiguration.default
config.httpAdditionalHeaders=[
“接受”:“应用程序/json”,
“内容类型”:“应用程序/x-www-form-urlencoded”
]
做{
让aPost=Post(用户名:“用户名”,密码:“密码”)
let encoder=JSONEncoder()
让encodedPost=try encoder.encode(aPost)
let session=URLSession(配置:config)
var request=URLRequest(url:url!)
request.httpMethod=“POST”
request.httpBody=encodedPost
让task=session.dataTask(with:request){data,response,中的错误
做{
让sentPost=try JSONDecoder().decode(Get.self,from:data)
打印(哨所)
}捕获{
打印(错误。本地化描述)
}
}
task.resume()
}抓住{
打印(错误。本地化描述)
}

您的模型在哪里?请您整理一下问题中的代码,即正确缩进和构造它。它看起来像是由一个类和一个单独的代码片段组成。如果是这样的话,让它变得显而易见。如果您希望得到其他人的帮助,请不要让他们不必要地难以理解问题和代码。与其创建分隔字符串(&S),不如尝试将整个字典作为数据发布。如果你在服务器端调试,你能看到正在发送的数据吗?@Codo,我已经清理了代码,请你现在帮助我好吗?谢谢你的帮助@nayem,在使用上述代码后,我得到了错误,因为“数据丢失,无法读取”。然后是其他问题。在
dataTask..
函数的完成处理程序中放置一个断点,并调查问题。也许你的解码不正确,或者你的服务器没有向你发送数据,让我试试,但是我之前已经得到了数据,如果我不使用你的代码,我仍然得到了数据,只是我无法使用我的Post模型是的,调查。您可以尝试
print(String(data:data,encoding:.utf8)
查看API实际返回的内容。可选(“error\”:“unsupported\u grant\u type\”)是错误,因为我正在发布应用程序/x-www-form-urlencoded not JSON
let url = URL(string: "<YOUR URL HERE>")
let config = URLSessionConfiguration.default
config.httpAdditionalHeaders = [
    "Accept" : "application/json",
    "Content-Type" : "application/x-www-form-urlencoded"
]

do {
    let aPost = Post(username: "username", password: "password")
    let encoder = JSONEncoder()
    let encodedPost = try encoder.encode(aPost)

    let session = URLSession(configuration: config)
    var request = URLRequest(url: url!)
    request.httpMethod = "POST"
    request.httpBody = encodedPost

    let task = session.dataTask(with: request) { data, response, error in
        do {
            let sentPost = try JSONDecoder().decode(Get.self, from: data)
            print(sentPost)
        } catch { 
            print(error.localizedDescription)
        }
    }
    task.resume()
} catch {
    print(error.localizedDescription)
}