Java 在swift中将字符串转换为数据库HTTP.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

在“向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;

        }
使用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)