Ваш тип контента - application/x-www-form-urlencoded
, но вы задаете тело в виде JSON вместо параметров в кодировке URL. То, как ваше тело HTTP выглядит так, как у вас сейчас, выглядит примерно так:
{"uname":"21120113120038","pass":"123456"}
... но вы хотите, чтобы оно выглядело так:
uname=21120113120038&pass=123456
Итак, заменитеэта строка:
guard let httpBody = try? JSONSerialization.data(withJSONObject: parameter, options: []) else {return}
... с чем-то вроде этого:
guard let httpBody = parameter.map({
[$0.addingPercentEncoding(withAllowedCharacters: .alphanumerics) ?? "",
$1.addingPercentEncoding(withAllowedCharacters: .alphanumerics) ?? ""].joined(separator: "=")
}).joined(separator: "&").data(using: .utf8) else { return }
(Тем не менее, я думаю, что это немного грязно, поэтому вот некоторые расширения, чтобы немного его очистить:)
extension String {
var urlEncodedQueryKeyOrValue: String {
return addingPercentEncoding(withAllowedCharacters: .alphanumerics) ?? ""
}
}
extension Dictionary where Key == String, Value == String {
var wwwFormURLEncodedString: String {
return map { "\($0.urlEncodedQueryKeyOrValue)=\($1.urlEncodedQueryKeyOrValue)" }.joined(separator: "&")
}
}
И тогда вы будете использовать это так:
[...]
guard let httpBody = parameter.wwwFormURLEncodedString.data(using: .utf8) else { return }
request.httpBody = httpBody
[...]