在向 web 服务发送请求时,我的参数字符串应该以 UTF8 编码为基础,这里有我获取数据库 UTF8 编码的代码:
let postData
= try! JSONSerialization.data(withJSONObject: param, options: JSONSerialization.WritingOptions.prettyPrinted)
//param is NSDictionary
let jsonString = NSString(data: postData, encoding: String.Encoding.utf8.rawValue)! as String
let pair = "action=payment&key=hmn@$Q*$GD4@!$#&input=\(jsonString)"
let post = pair.data(using: String.Encoding.utf8, allowLossyConversion: true)
request.httpMethod = "POST"
request.httpBody = post
android中有java代码:
pairs.add(new BasicNameValuePair("action", "payment"));
pairs.add(new BasicNameValuePair("key", "hmn@$Q&*$GD4@!$#"));
pairs.add(new BasicNameValuePair("input", item.toString()));
try {
httpGet.setEntity(new UrlEncodedFormEntity(pairs, HTTP.UTF_8));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
Exception_Code = 1;
}
输入 key 中的某些参数使用 MD5 和 tripleDes 加密,我无法从 Web 服务获得响应,因为在 swift 中编码基 UTF8 + 加密数据中的字符随空格变化,如何在 swift 中编码基 HTTP.UTF_8。 swift :
"ExpDate" : "ZIT5KR2 4Mk="
在安卓中:
"ExpDate":"ZIT5KR2+4Mk="
如何解决这个问题?
最佳答案
您的问题很难理解,因为您没有解释 "ExpDate":"ZIT5KR2+4Mk="
是什么。它包含在哪个部分?我假设 ExpDate 是一个序列化为 JSON 的属性 param 字典。我进一步假设加号字符是Base64编码后的原始字符,并不是在构建URL请求时插入的。
您的服务器显然需要一个带有 URL 编码表单数据的 POST 请求。 Android (UrlEncodedFormEntity
) native 支持这种请求,但 iOS 不支持。要实现相同的目的,您不能只连接键/值对。您还必须对它们进行正确的 URL 编码。
为此,我提出以下 URLRequest
扩展:
import Foundation
extension URLRequest {
private static let alloweCharacters = CharacterSet(charactersIn: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 -_.*")
public mutating func setURLEncodedFormData(parameters: [String: String?]) {
var encodedParameters = ""
for (key, value) in parameters {
if !encodedParameters.isEmpty {
encodedParameters += "&"
}
encodedParameters += URLRequest.urlEncoded(value: key)
encodedParameters += "="
if let value = value {
encodedParameters += URLRequest.urlEncoded(value: value)
}
}
self.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
self.httpBody = encodedParameters.data(using: .utf8)
}
private static func urlEncoded(value: String) -> String {
return value.addingPercentEncoding(withAllowedCharacters: alloweCharacters)!.replacingOccurrences(of: " ", with: "+")
}
}
可以这样使用(在 Playground 测试过):
var request = URLRequest(url: URL(string: "http://somehost.com/someservice")!)
request.httpMethod = "POST"
let jsonString = "{ \"ExpDate\" : \"ZIT5KR2+4Mk=\", \"SomeString\" : \"%=&\" }"
var params = [ "action": "payment", "key": "hmn@$Q&*$GD4@!$#", "input": jsonString]
request.setURLEncodedFormData(parameters: params)
希望能解决您的问题。
关于java - 快速将字符串转换为数据库 HTTP.UTF8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41416276/