当前位置: 首页 > 知识库问答 >
问题:

Swift HTTP Post请求DataSingEncoding使字符串变形

阎修明
2023-03-14
$username = $_POST['username'];
$password = $_POST['password'];
if (!empty($username) && !empty($password)) {
    $encrypted_password = md5($password);
    $user -> login($username,$encrypted_password);
} else {
    $json['error'] = 'You must fill all fields!';
    echo json_encode($json);
    mysqli_close($this->connection);
}
{"error":"You must fill all fields!"}

但是在iOS中,当我们对字符串进行编码时,它会将发送给php脚本的整个字符串转换为:

Optional(<75736572 6e616d65 3d612670 61737377 6f72643d 61>)

因为php脚本希望数据如下所示:

username=xyz&password=xyz

它当然不起作用。

SWIFT代码:

let username = UsernameTextField.text ?? ""
        let password = PasswordTextField.text ?? ""
        
        if(username.isEmpty || password.isEmpty) {return; }
        
        
        
        let request = NSMutableURLRequest (URL: NSURL(string: "http://myip/loginregister.php")!)
        request.HTTPMethod = "POST"
        request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField:"Content-Type")
        let postString = "username=\(username)&password=\(password)"
        request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding)
        let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { data, response, error in
            guard error == nil && data != nil else {
                // check for fundamental networking error
                print("error=\(error)")
                return
            }
            
            let data = postString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!
            
            
            do {
                if let json = try NSJSONSerialization.JSONObjectWithData(data, options: []) as? NSDictionary {
                    let success = json["success"] as? Int                                 
                    print("Success: \(success)")
                } else {
                    let jsonStr = NSString(data: data, encoding: NSUTF8StringEncoding)   
                    print("Error could not parse JSON: \(jsonStr)")
                }
            } catch let parseError {
                print(parseError)                                                      `JSONObjectWithData`
                let jsonStr = NSString(data: data, encoding: NSUTF8StringEncoding)
                print("Error could not parse JSON: '\(jsonStr)'")
            }
        }
        
        task.resume()

错误消息:

Error Domain=NSCocoaErrorDomain Code=3840 "JSON text did not start with array or object and option to allow fragments not set." UserInfo={NSDebugDescription=JSON text did not start with array or object and option to allow fragments not set.}
Error could not parse JSON: 'Optional(username=a&password=a)'

共有1个答案

韩朝斑
2023-03-14

a)你扔掉服务器的答案...

b)熟悉调试器并检查PostString的内容;它从来都不是有效的JSON,因此不能期望转换成功。

c)不要把发送和接收部分混在一起,而是解决一个又一个问题。

 类似资料:
  • 问题内容: 我想构造与OPENROWSET方法一起使用的查询。 例子: 但是当我这样做时,我得到了错误: ’+’附近的语法不正确 如何建立查询?谢 问题答案: 尽管in中的查询被指定为字符串,并且通过这种方式看起来非常像动态查询,但是语法不允许将其以同样的方式构造成一部分。 恐怕,您将必须构建一个动态查询,该查询将调用,如下所示:

  • 我正在使用保护我的应用程序,并且我要求允许用户通过第三方应用程序中的链接登录。 但是,第三方应用程序中的链接将重定向到特定资源,而不是登录页面,用户希望访问的资源将被定义为查询字符串参数。因此,例如,链接的形式为: 当用户单击此链接时,他们应该被带到我的Spring Security配置中定义的登录页面,如果经过身份验证,则应该被重定向到包含querystring参数的原始链接。querystri

  • 我正在开发一个Android应用程序,它使用改造来创建一个restful客户端。为了调试网络调用,我想显示或转储实际被调用的url。有办法做到这一点吗?我在下面提供了一些代码,显示了应用程序当前如何使用翻新。 客户端接口定义: 使用生成的客户端的服务:

  • 我使用的是spring boot Version-2.0.6.Release和spring cloud Version-finchley.sr2

  • 问题内容: 有人告诉我不能更改Java中的字符串。下面的代码呢? 它不改变字符串吗?另外,replace()的实现在哪里;相比于(); 等于(); 提供?我只是在这里使用这些功能,但实际上在哪里实现? 问题答案: String.replace()返回一个新的String。 “名称”是对String对象的引用,因此可以将其重新分配为指向name.replace(),但它将指向一个新对象。 这是Str

  • 我试图让一个语句起作用,但由于某些原因,它不起作用。应该很简单。 假设字符串 我的代码是: 两种规格的结果都是1。