无法在 Swift 应用程序上解析服务器 PHP

Posted

技术标签:

【中文标题】无法在 Swift 应用程序上解析服务器 PHP【英文标题】:Unable to parse server PHP on Swift app 【发布时间】:2016-03-29 11:43:00 【问题描述】:

我正在尝试在我的 ios 应用上实现注册/登录功能。 为此,我编写了一个简单的服务器端 php 脚本,只是为了检查它是否返回一个值。 这是我的php代码:

<?php

if(isset($_POST["username"]))
$username = $_POST["username"];
$password = $_POST["password"];
if($username == "admin" && $password == "admin")

$details;
$details['success'] = $username;
echo json_encode($details);

else
echo "invalid credential";

;
?>

这是登录屏幕中的代码:

let myUrl = NSURL(string: "http://localhost/app/index.php")  
    let request = NSMutableURLRequest(URL:myUrl!)
    request.HTTPMethod = "POST" 
    request.addValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
    request.addValue("application/json", forHTTPHeaderField: "Accept") 
    //print("\(usernameField.text!), \(passwordField.text!), \(emailField.text!)")  
    //let params = ["user":"\(usernameField.text!)","pass":"\(passwordField.text!)"] as NSDictionary  
    let bodyData = "username=\(usernameField.text)&password=\(passwordField.text)"  
    request.HTTPBody = bodyData.dataUsingEncoding(NSUTF8StringEncoding)

    let task = NSURLSession.sharedSession().dataTaskWithRequest(request, completionHandler: 
            data, response, error in
            do 
                let json = try NSJSONSerialization.JSONObjectWithData(data!, options: []) as? NSDictionary
                print("json is : \(json!)")
                if let parseJSON = json 
                    let firstNameValue = parseJSON["success"] as? String
                    print("Username: \(firstNameValue!)")
                
             catch 
                print("errorrrrr: \(error)")
              
            if error != nil 
                print("error=\(error!)")
                return
                    
            // You can print out response object
            print("Response = \(response!)")
            // Print out reponse body
            let responseString = NSString(data: data!, encoding: NSUTF8StringEncoding)
            print("response Data = \(responseString!)")


        )
        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.

我的响应数据是“无效凭据”

【问题讨论】:

【参考方案1】:

您的 php 脚本对于 web 服务不完整。它没有返回 json。您必须先完成您的网络服务。我不是一个php人。但我仍然尝试改进脚本:

<?php
if(isset($_POST["username"]))
$username = $_POST["username"];
$password = $_POST["password"];
if($username == "admin" && $password == "admin")

    $details;
    $details['success'] = $username;
    return json_encode($details);

else
    return json_encode( array("response" => "invalid credential") );

;
?>

更新:在迭代 alamofire 库后使用以下代码访问 web 服务:

let parameters = ["username": usernameField.text! ,"password" : passwordField.text! ]

Alamofire.request(.POST, "http://localhost/app/index.php", parameters: parameters)
     .responseString  response in
         print("Response String: \(response.result.value)")
     
     .responseJSON  response in
         print("Response JSON: \(response.result.value)")
       //Handle the json response here
      if let parseJSON = response.result.value 
                let firstNameValue = parseJSON["success"] as? String
                print("Username: \(firstNameValue!)")
            
     

【讨论】:

谢谢,我明天试试,然后告诉你。 是的,我确信错误出现在 swift 代码中。不知道是什么。 你为什么不使用 Alamofire。它默认处理 json。我们不必关心它。只需将库集成到您的项目中即可。以下是这样做的说明:github.com/Alamofire/Alamofire 我们,我将 php 文件更改为我的项目所需的文件,它正在工作。无论如何,谢谢 不知道,考虑到php脚本本身并没有错。必须是从应用程序发送的请求必须以不同的方式表现。新的 php 代码涉及很多数据库连接和其他东西。我的朋友给了我那个文件。但是,在 Swift 代码中,我确实做了 1 处更改。我将json解析代码放在“响应块”中。

以上是关于无法在 Swift 应用程序上解析服务器 PHP的主要内容,如果未能解决你的问题,请参考以下文章

使用 PHP 在 Swift 5 中使用 Alamofire 接收图像上传

无法在 Swift 中解析 JSON。 “应解码 Dictionary<String, Any>,但找到了一个数组。” [复制]

Swift Package Manager 无法解析 1.4 以上的 Kitura 版本

Swift:无法解析 JSON 数据 [重复]

Swift:从 JSON 解析日期 [关闭]

无法解析响应 alamofire swift 3