Alamofire 不允许直接发送对象

Posted

技术标签:

【中文标题】Alamofire 不允许直接发送对象【英文标题】:Alamofire doesnt allow to send object directly 【发布时间】:2019-04-30 10:02:27 【问题描述】:

我的 API 只接受对象作为主体,但 alamofire 只将字典作为对象发送,我的服务器不接受请求帮助

我必须使用 alamofire 调用一个作为 post api 的 API

只要我将模型转换为字典,将字典转换为 json 并发布它 Alamofire 不允许我发布字符串

它允许我发送我的 api 不接受的字典

["key":"value"]- Not acceptable
"key":"value"- Acceptable

任何人都可以分享任何解决方案吗?

我正在使用 Swift 5、Xcode 10、Alamofire 4.8.2

do
    let d  = try data.asDictionary()
    jsonString = DictionaryToJSON(data: dictionary)
 catch 
    print(error)

Alamofire.request(url, method: .post, parameters: jsonString, encoding: .utf8, headers: [: ]).responseJSON  (res) in
    print(res.result)
    print("Request Data \(res.request) \n Dictionary \(jsonString)")
    do 
        let d = try JSONDecoder().decode([OTPMessage].self, from: res.data!)
        print(d[0].message)
     catch 
        print(error)
    


// Dictionary to JSON

func DictionaryToJSON(data: [String:Any])->String 
    if let theJSONData = try? JSONSerialization.data(
        withJSONObject: data,
        options: .prettyPrinted
    ),
    let theJSONText = String(data: theJSONData, encoding: String.Encoding.ascii) 
        print("JSON string = \n\(theJSONText)")
        return theJSONText
    
    else 
        return ""
    


// Object to Dictionary

extension Encodable 
    func asDictionary() throws -> [String: Any] 
        let data = try JSONEncoder().encode(self)
        guard let dictionary = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as? [String: Any] else 
            throw NSError()
        
        return dictionary
    


//Struct
struct OTPMessage:Codable 
    var message = String()

【问题讨论】:

【参考方案1】:

您不必将字典转换为 JSON 字符串,因为 Alamofire 可以进行编码,请参阅此 example。

我建议你把你的代码改成这样

do
   let dictionary = try data.asDictionary()
   Alamofire.request(url, method: .post, parameters: dictionary, encoding: .JSON, headers: [:]).responseJSON  (res) in
        print(res.result)
        print("Request Data \(res.request) \n Dictionary \(jsonString)")
        do
            let d = try JSONDecoder().decode([OTPMessage].self, from: res.data!)
            print(d[0].message)
        catch
            print(error)
        
    
 catch
    print(error)

【讨论】:

【参考方案2】:

使用 Alamofire,您无法做到这一点。您需要做的是创建一个URLRequest 对象并设置它的httpBody 属性,然后将其传递给Alamofire。

URLRequest 允许您将Data 作为 POST 正文。

            var request = URLRequest(url: urlFinal)
            request.httpMethod = HTTPMethod.post.rawValue
            request.allHTTPHeaderFields = dictHeader
            request.timeoutInterval = 10
            request.httpBody = newPassword.data(using: String.Encoding.utf8)

            Alamofire.request(request).responseString  (response) in
                if response.response!.statusCode >= 200 && response.response!.statusCode <= 300 
                    completion("success")
                else 
                    completion("failed")
                
            

这里newPassword 是字符串。从那里我创建了Data 对象。您必须将自定义类对象转换为 Data 对象。

【讨论】:

以上是关于Alamofire 不允许直接发送对象的主要内容,如果未能解决你的问题,请参考以下文章

如何使用Alamofire将单个对象作为参数发送

由于对成员 jsonObject 的不明确引用,我无法编译我的 alamofire 代码。为啥?

错误:导入 Alamofire

强制 Alamofire 在主线程上做所有事情?

在 Alamofire 4.0 中初始化 SessionManager

安装库 Alamofire 可能出现错误