Как опубликовать эти JSON данные как тело HTTP, используя URLSession? - PullRequest
0 голосов
/ 31 марта 2020

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()

Ответы [ 2 ]

1 голос
/ 31 марта 2020

Подготовка 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

1 голос
/ 31 марта 2020

С 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)

option1, option2, option3, option4, может быть массивом в структуре (для этого потребуется пользовательское кодирование / декодирование).

...