如何将其转换为带有 JSON 序列化对象的 POST 调用

Posted

技术标签:

【中文标题】如何将其转换为带有 JSON 序列化对象的 POST 调用【英文标题】:How to convert this to a POST call with a JSON serialized Object 【发布时间】:2017-04-27 07:16:12 【问题描述】:

我已经尝试过 Alamofire,我全心全意地尝试过。它对我不起作用。我终于让 http GET 工作了,但我需要让 http POST 工作。我们的 POST API 采用一个 Request 对象,其中包含所有必要的数据。我已要求后端开发人员向我提供一个 KEY-VALUE 对 JSON(无嵌入式对象/数组),以便我可以在我的 swift 代码中使用 Dictionary 将其转换为 json 并发送请求。我现在只需要将以下代码转换为 POST。

我之前的问题没有多大帮助。 NSInvalidArgumentException Invalid type in JSON write DemographicsPojo Swift 3.0, Alamofire 4.0 Extra argument 'method' in call

我已经放弃了 Alamofire。我想使用基础课程。简单的基本和基本的生活方式:)。

 func callWebService(url : String) 
        // Show MBProgressHUD Here
        var config                              :URLSessionConfiguration!
        var urlSession                          :URLSession!

        config = URLSessionConfiguration.default
        urlSession = URLSession(configuration: config)

        // MARK:- HeaderField
        let HTTPHeaderField_ContentType         = "Content-Type"

        // MARK:- ContentType
        let ContentType_ApplicationJson         = "application/json"

        //MARK: HTTPMethod
        let HTTPMethod_Get                      = "GET"

        let callURL = URL.init(string: url)

        var request = URLRequest.init(url: callURL!)

        request.timeoutInterval = 60.0 // TimeoutInterval in Second
        request.cachePolicy = URLRequest.CachePolicy.reloadIgnoringLocalCacheData
        request.addValue(ContentType_ApplicationJson, forHTTPHeaderField: HTTPHeaderField_ContentType)
        request.httpMethod = HTTPMethod_Get

        let dataTask = urlSession.dataTask(with: request)  (data,response,error) in
            if error != nil
                print("Error **")

                return
            
            do 
                let resultJson = try JSONSerialization.jsonObject(with: data!, options: []) as? [String:AnyObject]
                print("Result",resultJson!)
             catch 
                print("Error -> \(error)")
            
        

        dataTask.resume()
        print("..In Background..")
    

【问题讨论】:

我有点困惑你要求重写代码来发送 POST 请求?请自行尝试,如果不起作用,请寻求帮助。 相信我,我已经尝试过了,但失败了。我终于有一个工作的 GET,但不能让 POST 工作。 【参考方案1】:

只需将 JSON 字符串和 API URL 传递给此函数。 POST 的完整代码。

func POST(api:String,jsonString:String,completionHandler:@escaping (_ success:Bool,_ response:String?,_ httpResponseStatusCode:Int?) -> Void)  

    let url = URL(string: api)

    var request: URLRequest = URLRequest(url: url!)

    request.httpMethod = "POST"

    request.setValue("application/json", forHTTPHeaderField:"Content-Type")
    request.timeoutInterval = 60.0

    //additional headers
    if let token = Helper.readAccessToken() 
        request.setValue("\(token)", forHTTPHeaderField: "Authorization")
    

    let jsonData = jsonString.data(using: String.Encoding.utf8, allowLossyConversion: true)
    request.httpBody = jsonData

    let task = URLSession.shared.dataTask(with: request) 
        (data: Data?, response: URLResponse?, error: Error?) -> Void in

        var responseCode = 0
        if let httpResponse = response as? HTTPURLResponse 
            responseCode = httpResponse.statusCode
            print("responseCode \(httpResponse.statusCode)")
        

        if error != nil 
            completionHandler(false, error?.localizedDescription,nil)

         else 
            let responseString = String(data: data!, encoding: .utf8)
            completionHandler(true, responseString, responseCode)
        
    

    task.resume()

【讨论】:

以上是关于如何将其转换为带有 JSON 序列化对象的 POST 调用的主要内容,如果未能解决你的问题,请参考以下文章

如何将数据从多个输入字段转换为单个 JSON 对象以进一步将其插入单个 mysql 字段

JSON.ENCODE 将带有空格的变量拆分为多个变量

Typescript - 从带有日期字符串的 Json 字符串自动转换为带有 Date 属性的对象

如何在 Kotlin 中解析 JSON?

JSON如何反序列化日期时间并将UTC转换为指定时区?

将 C# 对象转换为 Json 对象