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 不允许直接发送对象的主要内容,如果未能解决你的问题,请参考以下文章
由于对成员 jsonObject 的不明确引用,我无法编译我的 alamofire 代码。为啥?