【问题标题】:How to POST request with parameters using Alamofire/URLSession.dataTask in swift如何在 swift 中使用 Alamofire/URLSession.dataTask 发布带有参数的请求
【发布时间】:2018-06-27 06:47:36
【问题描述】:

我尝试了两种方法来发布请求以调用 API。 Alamofire & URLSession.dataTask 但我无法成功发送参数。

这些是我尝试过的方法

参数

var params :[String: AnyObject]?
    params = ["Some_ID" : "53" as AnyObject, "REQUEST" : "SOME_API_NAME" as AnyObject]

一个 --> Alamofire

Alamofire.request(BaseURL, method: .post, parameters: params, encoding: JSONEncoding.default, headers: nil).responseJSON { (response:DataResponse<Any>) in

        switch(response.result) {
        case .success(_):
            if response.result.value != nil{
                print(response.result.value as Any)
            }
            break

        case .failure(_):
            print(response.result.error as Any)
            break
        }
    }

两个 --> URLSession.dataTask

    if let theJSONData = try? JSONSerialization.data(
        withJSONObject: params as Any,
        options: []) {
        let theJSONText = String(data: theJSONData,
                                 encoding: .ascii)
        print("JSON string = \(theJSONText!)")

        let request = NSMutableURLRequest(url: URL(string:BaseURL)!)
        request.httpMethod = "POST"
        //Here are the required Params.
        let postString = theJSONText

        request.httpBody = postString?.data(using: String.Encoding.utf8)


        let task = URLSession.shared.dataTask(with: request as URLRequest) { data, response, error in
            guard error == nil && data != nil else {                                                          // check for fundamental networking error

                print("error=\(String(describing: error))")
                return
            }

            if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 {
                print("statusCode should be 200, but is \(httpStatus.statusCode)")
                print("response = \(String(describing: response))")
                return
            }
            let responseString = NSString(data: data!, encoding: String.Encoding.utf8.rawValue)!
            let responseStringForJson = "[\(responseString)]"

            print("result = \(String(describing: responseStringForJson))")

        }
        task.resume()
    }

在这两种情况下,我都面临同样的问题。 API调用并成功到达服务器,但服务器返回错误Request parameter is missing

有趣的是,API 在 POSTMAN 中工作和响应,并在我的 Objective-C 代码中使用 AFNetworking。

请告诉我我在这里做错了什么......

【问题讨论】:

  • 你应该使用[String: Any] & 避免演员
  • 好的,不过也试过了。
  • 也许您缺少端点? Alamofire.request(BaseURL+Endpoints ?
  • 使用request.httpBody = theJSONData。有无用的转换并且不一样(一个是ASCII,另一个是UTF8):Dict => Data => String => Data。在 Swift 3+ 中避免 NSMutableURLRequest,更喜欢 URLRequest,甚至应该避免之后的演员 request as URLRequest

标签: ios swift alamofire nsurlsession


【解决方案1】:

使用第二种方法 (URLSession.dataTask) 并从参数字典中获取 POST 字符串,如下所示。希望这将适用于您的情况。

试试下面的代码,让我知道。现在从viewDidLoad 拨打getDataFromAPI 并进行测试。

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

func getDataFromAPI() {

    var params :[String: Any]?
    params = ["Some_ID" : "111", "REQUEST" : "SOME_API_NAME"]

    let url =  URL(string:BaseURL)
    var request = URLRequest(url: url!)
    request.httpMethod = "POST"

    let postString = getPostString(params: params!)
    request.httpBody = postString.data(using: .utf8)

    let task = URLSession.shared.dataTask(with: request as URLRequest) { data, response, error in
        guard error == nil && data != nil else {
            print("error=\(String(describing: error))")
            return
        }
        if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 {
            print("statusCode should be 200, but is \(httpStatus.statusCode)")
            print("response = \(String(describing: response))")
            return
        }
        let responseString = NSString(data: data!, encoding: String.Encoding.utf8.rawValue)!
        let responseStringForJson = "[\(responseString)]"
        print("result = \(String(describing: responseStringForJson))")
    }
    task.resume()
}

【讨论】:

    猜你喜欢
    • 2020-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-31
    • 1970-01-01
    • 1970-01-01
    • 2017-03-02
    • 1970-01-01
    相关资源
    最近更新 更多