簡體   English   中英

如何使用 URLSession 將此 JSON 數據作為 HTTP 正文發布?

[英]How to post this JSON data as HTTP body using URLSession?

我必須發布的 JSON:

{
  "quizId": 1,
  "quizQuestionBanks": [
    {
      "quizQuestionBankId": 4,
      "question": "string",
      "option1": "string",
      "option2": "string",
      "option3": "string",
      "option4": "string",
      "answer": "Guy de Maupassant",
      "explanation": "string"
    }
  ]
}

我做了 URLSession Post 部分。 但不知道如何發布這種JSON。 早些時候我已經發布了這樣的 JSON。

let json: [String: Any] = ["key": "value"]

但對我來說有點復雜。

我為發布所做的代碼如下

let url = URL(string: postUrl)! //PUT Your URL

        var request = URLRequest(url: url)

        request.httpMethod = "POST"

        request.setValue("\(String(describing: jsonData?.count))", forHTTPHeaderField: "Content-Length")

        request.addValue("application/json", forHTTPHeaderField: "Content-Type")

        request.addValue("Token \(String(describing: token))", forHTTPHeaderField: "Authorization")


        // insert json data to the request
        request.httpBody = jsonData

        URLSession.shared.dataTask(with: request) { data, response, error in
            guard let data = data, error == nil else {
                print(error?.localizedDescription ?? "No data")
                return
            }
            let responseJSON = try? JSONSerialization.jsonObject(with: data, options: [])
            if let responseJSON = responseJSON as? [String: Any] {
                print(responseJSON) //Code after Successfull POST Request
            }
        }.resume()

使用JSONSerialization

let params: [String: Any] = ["quizId": 1,
                             "quizQuestionBanks": [["quizQuestionBankId": 4,
                                                    "question": "string",
                                                    "option1": "string",
                                                    "option2": "string",
                                                    "option3": "string",
                                                    "option4": "string",
                                                    "answer": "Guy de Maupassant",
                                                    "explanation": "string"]]]

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

但是,從 Swift 4 開始,我們可以使用 Codable:

struct Quiz: Codable {
    let id: Int
    let questions: [Question]

    enum CodingKeys: String, CodingKey {
        case id = "quizId"
        case questions = "quizQuestionBanks"
    }
}

struct Question: Codable {
    let id: Int
    let question: String
    let option1: String
    let option2: String
    let option3: String
    let option4: String
    let answer: String
    let explanation: String

    enum CodingKeys: String, CodingKey {
        case id = "quizQuestionBankId"
        case question
        case option1
        case option2
        case option3
        case option4
        case answer
        case explanation
    }
}

let questions = [Question(id: 4, question: "string", option1: "string", option2: "string", option3: "string", option4: "string", answer: "Guy de Maupassant", explanation: "string")]
let quiz = Quiz(id: 1, questions: questions)
let jsonData = try JSONEncoder().encode(quiz)

option1option2option3option4 ,可以是結構體中的數組(需要自定義編碼/解碼)。

准備要上傳的 JSON 數據

 struct Quiz: Codable {
        let quizId: Int
        let quizQuestionBanks: [QuizQuestionBank]
    }

struct QuizQuestionBank: Codable {
    let quizQuestionBankId: Int
    let question: String
    let option1: String
    let option2: String
    let option3: String
    let option4: String
    let answer: String
    let explanation: String

}

let quiz = Quiz(quizId: 1, quizQuestionBanks: [QuizQuestionBank(quizQuestionBankId: 4, question: "string", option1: "string", option2: "string", option3: "string", option4: "string", answer: "Guy de Maupassant", explanation: "string")])

guard let uploadData = try? JSONEncoder().encode(quiz) else {
    return
}

配置 URL 請求

let url = URL(string: "https://example.com/post")!
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.setValue("application/json", forHTTPHeaderField: "Content-Type")

使用上傳任務

let task = URLSession.shared.uploadTask(with: request, from: uploadData) { data, response, error in
        if let error = error {
            print ("error: \(error)")
            return
        }
        guard let response = response as? HTTPURLResponse,
            (200...299).contains(response.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)")
        }
    }
    task.resume()

有關更多詳細信息,請參閱Apple 開發者網站上的此鏈接。 https://developer.apple.com/documentation/foundation/url_loading_system/uploading_data_to_a_website

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM