How to add Array value to JSON Key in Swift

大兔子大兔子 提交于 2020-06-01 06:22:11

问题


How to add request.httpBody = getPostData(params: ["contactsList": ["1212121212, "5555555544"]]) in place of let parameters = getPostString(params: ["contactsList":[phNumArray]])

below is working code but how to add phNumArray in palce of individual of individual numberes to contactsList

Postman output for API:

working code: anyone can copy paste to see output

 import UIKit
 class TestViewController: UIViewController {

var phNumArray  = ["1111111111", "5555555544"]
override func viewDidLoad() {
super.viewDidLoad()

    callPostApi()
}
func getPostString(params:[String:Any]) -> String
{
    var data = [String]()
    for(key, value) in params
    {
        data.append(key + "=\(value)")
    }
    print(data.map { String($0) }.joined(separator: "&"))
    return data.map { String($0) }.joined(separator: "&")
}

func callPostApi(){

    let url = URL(string: "http://itaag-env-1.ap-south-1.elasticbeanstalk.com/filter/taggedusers/")
    guard let requestUrl = url else { fatalError() }
    var request = URLRequest(url: requestUrl)
    request.httpMethod = "POST"

    request.setValue("EC3746E9-4DB4-42C7-9D8C-1542B18C2AC", forHTTPHeaderField: "deviceid")
    request.setValue("5fe42fb3b54543a0bab5667cf96526f8", forHTTPHeaderField: "key")
    request.setValue("personal", forHTTPHeaderField: "userType")

    let parameters = getPostString(params:   ["contactsList":["5555555544", "11111111111"]])

    print("json parameter phone numbers \(parameters)")

    request.httpBody = parameters.data(using: .utf8)
    let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
            let httpResponse = response as? HTTPURLResponse
            // Check for Error
            if let error = error {
                print("Error took place \(error)")
                return
            }
            if let data = data, let dataString = String(data: data, encoding: .utf8) {
                print("Response data string:\n \(dataString)")

               do {
                   let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as! [String: Any]
                    print("fetching json \(json)")
                   let fetchStatus = json["userName"] as? String
                   print("fetching json userName \(String(describing: fetchStatus))")

                let user = json["5555555544"] as? [String: Any]
                let name = user?["userName"] as? String
                print("first username \(name)")
               }
               catch{}
            }
    }
    task.resume()
 }
 }

please help me to solve the issue with contactsList value.


回答1:


Update: All this time you were sending the request as JSON encoded instead of as form-data. I'm adding the code for that below, try it out:

class ViewController: UIViewController {

    var phNumArray  = ["1111111111", "5555555544"]

    override func viewDidLoad() {
        super.viewDidLoad()

        callPostApi()
    }

    func getPostData(params: [String:Any]) -> Data? {
        return try? JSONSerialization.data(withJSONObject: params, options: .prettyPrinted)
    }

    func callPostApi() {

        let url            = URL(string: "http://itaag-env-1.ap-south-1.elasticbeanstalk.com/filter/taggedusers/")!
        var request        = URLRequest(url: url)
        request.httpMethod = "POST"

        request.setValue("EC3746E9-4DB4-42C7-9D8C-1542B18C2AC", forHTTPHeaderField: "deviceid")
        request.setValue("5fe42fb3b54543a0bab5667cf96526f8", forHTTPHeaderField: "key")
        request.setValue("personal", forHTTPHeaderField: "userType")

        try? request.setMultipartFormData(["contactsList": "\(phNumArray)"], encoding: .utf8)

        URLSession.shared.dataTask(with: request) { data, _, _ in
            if let data = data, let json = try? JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String: Any] {

                let user = json["5555555544"] as? [String: Any]
                let name = user?["userName"] as? String
                print("first username \(name)")
            }
        }.resume()
    }
}

extension URLRequest {

    public mutating func setMultipartFormData(_ parameters: [String: String], encoding: String.Encoding) throws {

        let makeRandom = { UInt32.random(in: (.min)...(.max)) }
        let boundary = String(format: "------------------------%08X%08X", makeRandom(), makeRandom())

        let contentType: String = try {
            guard let charset = CFStringConvertEncodingToIANACharSetName(CFStringConvertNSStringEncodingToEncoding(encoding.rawValue)) else {
                throw MultipartFormDataEncodingError.characterSetName
            }
            return "multipart/form-data; charset=\(charset); boundary=\(boundary)"
        }()
        addValue(contentType, forHTTPHeaderField: "Content-Type")

        httpBody = try {
            var body = Data()

            for (rawName, rawValue) in parameters {
                if !body.isEmpty {
                    body.append("\r\n".data(using: .utf8)!)
                }

                body.append("--\(boundary)\r\n".data(using: .utf8)!)

                guard
                    rawName.canBeConverted(to: encoding),
                    let disposition = "Content-Disposition: form-data; name=\"\(rawName)\"\r\n".data(using: encoding) else {
                    throw MultipartFormDataEncodingError.name(rawName)
                }
                body.append(disposition)

                body.append("\r\n".data(using: .utf8)!)

                guard let value = rawValue.data(using: encoding) else {
                    throw MultipartFormDataEncodingError.value(rawValue, name: rawName)
                }

                body.append(value)
            }

            body.append("\r\n--\(boundary)--\r\n".data(using: .utf8)!)

            return body
        }()
    }
}

public enum MultipartFormDataEncodingError: Error {
    case characterSetName
    case name(String)
    case value(String, name: String)
}

Instead of converting to JSON String and then converting it to Data, use JSONSerialization, here's an example:

func getPostData(params:[String:Any]) -> Data? {
    return try? JSONSerialization.data(withJSONObject: params, options: .prettyPrinted)
}

And then assign it directly to URLRequest's httpBody, like this:

let arrayOfNumbers = [String]()
arrayOfNumbers.append("5555555544")
arrayOfNumbers.append("11111111111")
request.httpBody = getPostData(params: ["contactsList": arrayOfNumbers])

Also, go through the Apple Documentation, you'll find valuable information there. If don't understand concepts there google more about JSONSerializing and POST request httpBody.



来源:https://stackoverflow.com/questions/62084455/how-to-add-array-value-to-json-key-in-swift

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!