Java 在swift中将字符串转换为数据库HTTP.UTF8
在“向web服务发送请求”中,我的参数字符串应为编码基UTF8,其中有我的代码用于获取数据库UTF8编码:Java 在swift中将字符串转换为数据库HTTP.UTF8,java,android,ios,swift,utf-8,Java,Android,Ios,Swift,Utf 8,在“向web服务发送请求”中,我的参数字符串应为编码基UTF8,其中有我的代码用于获取数据库UTF8编码: let postData = try! JSONSerialization.data(withJSONObject: param, options: JSONSerialization.WritingOptions.prettyPrinted) //param is NSDictionary let jsonString = NS
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;
}
使用MD5和tripleDes加密输入密钥中的某些参数,我无法从web服务获得响应,因为在swift中编码base UTF8+加密数据中的字符随空间变化,如何在swift中编码base HTTP.UTF_8。
迅速:
"ExpDate" : "ZIT5KR2 4Mk="
在android中:
"ExpDate":"ZIT5KR2+4Mk="
如何解决这个问题?您的问题很难理解,因为您没有解释什么是
“ExpDate”:“ZIT5KR2+4Mk=“
”。它包含在哪个部分?我假设ExpDate是一个序列化为JSON的属性参数字典。我进一步假设加号是Base64编码后的原始字符,在生成URL请求时没有插入加号
您的服务器显然需要一个带有URL编码表单数据的POST请求。Android(UrlEncodedFormEntity
)本机支持此类请求,但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: "+")
}
}
可以这样使用(在操场上测试):
我希望它能解决您的问题。我的第一段代码可能没有正确涵盖所有情况。我添加了一个新版本,其中有一个自定义字符集,并将空格显式转换为加号。
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)