Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在swift中使用Alamofire/URLSession.dataTask发布带有参数的请求_Ios_Swift_Alamofire_Nsurlsession - Fatal编程技术网

Ios 如何在swift中使用Alamofire/URLSession.dataTask发布带有参数的请求

Ios 如何在swift中使用Alamofire/URLSession.dataTask发布带有参数的请求,ios,swift,alamofire,nsurlsession,Ios,Swift,Alamofire,Nsurlsession,我尝试了两种方法来发布调用API的请求Alamofire&URLSession.dataTask但我无法成功发送参数 这些是我尝试过的方法 参数 var params :[String: AnyObject]? params = ["Some_ID" : "53" as AnyObject, "REQUEST" : "SOME_API_NAME" as AnyObject] 一个-->阿拉莫菲尔 Alamofire.request(BaseURL, method: .post, par

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

这些是我尝试过的方法

参数

var params :[String: AnyObject]?
    params = ["Some_ID" : "53" as AnyObject, "REQUEST" : "SOME_API_NAME" as AnyObject]
一个-->阿拉莫菲尔

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
        }
    }
在这两种情况下,我都面临着同样的问题。API调用并成功到达服务器,但服务器返回错误请求参数丢失

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

请告诉我我做错了什么

使用第二种方法(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()
}

您应该使用
[String:Any]
&避免使用CastOk,但也尝试使用它。可能您缺少端点<代码>Alamofire.request(BaseURL+端点?使用
request.httpBody=theJSONData
。存在无用的转换,并且不同(一个是ASCII,另一个是UTF8):Dict=>Data=>String=>Data。在Swift 3+中避免
NSMutableURLRequest
,更喜欢
URLRequest
,甚至应该避免以后将
请求转换为URLRequest
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()
}