对 php 的 Swift 4 Json 请求

Posted

技术标签:

【中文标题】对 php 的 Swift 4 Json 请求【英文标题】:Swift 4 Json request to php 【发布时间】:2018-06-18 15:46:16 【问题描述】:

我需要你的帮助。 我试图在 Xcode Swift4 中编写一个 json 请求

php 的 JSON 请求:

var request = URLRequest(url: URL(string: "http://example.net/stock_service3.php")!)
        request.httpMethod = "POST"
        let postString = "id=112m&name=123"
        request.httpBody = postString.data(using: .utf8)
        let task = URLSession.shared.dataTask(with: request)  data, response, error in
            guard let data = data, error == nil else                                                  // check for fundamental networking error
                print("error=\(error)")
                return
            

            if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200            // check for http errors
                print("statusCode should be 200, but is \(httpStatus.statusCode)")
                print("response = \(response)")

            

            let responseString = String(data: data, encoding: .utf8)
            print("responseString = \(responseString)")
        
        task.resume()

这是包含在我的网络服务器中的 mysql PHP 代码:

<?php

// Create connection
$con=mysqli_connect("example.mysql:3306","example.net","3445432FruRjCAFk","example.net");

// Check connection
if (mysqli_connect_errno())

  echo "Failed to connect to MySQL: " . mysqli_connect_error();

 $postdata = json_decode(file_get_contents("php://input"),TRUE);

$id= $postdata["id"];
$name = $postdata["name"];
// Store values in an array
$returnValue = array($id,$name);

// Send back request in JSON format
echo json_encode($returnValue);
// Select all of our stocks from table 'stock_tracker'
$sql ="SELECT m.*


      , ( ACOS( COS( RADIANS( $id) ) 
              * COS( RADIANS( m.latitude ) )
              * COS( RADIANS( m.longitude ) - RADIANS( $name) )
              + SIN( RADIANS($id) )
              * SIN( RADIANS( m.Latitude) )
          )
        * 6371
        ) AS distance_in_km

  FROM TankBilliger m
  HAVING distance_in_km <= 100
 ORDER BY distance_in_km ASC
 LIMIT 100";

// Confirm there are results
if ($result = mysqli_query($con, $sql))

    // We have results, create an array to hold the results
        // and an array to hold the data
    $resultArray = array();
    $tempArray = array();

    // Loop through each result
    while($row = $result->fetch_object())
    
        // Add each result into the results array
        $tempArray = $row;
        array_push($resultArray, $tempArray);
    

    // Encode the array to JSON and output the results

    echo json_encode($resultArray);


// Close connections
mysqli_close($con);
?>

我的 mysql 代码可以工作,但如果我想使用从 Swift 获得的变量更改查询,Swift 会告诉我:[10788:3159246] 无法将类型“NSNull”(0x108589850)的值转换为“NSDictionary”(0x108589288) .

我希望 Query 得到 swift 的数量。

这是我的应用程序向我的 ios 应用程序显示 mysql 数据的代码,这是出现错误的代码。

import Foundation

protocol FeedmodelProtocol: class 
    func itemsDownloaded(items: NSArray)



class Feedmodel: NSObject, URLSessionDataDelegate 



    weak var delegate: FeedmodelProtocol!

    let urlPath = "http://example.net/stock_service3.php" //Change to the web address of your stock_service.php file

    func downloadItems() 

        let url: URL = URL(string: urlPath)!
        let defaultSession = Foundation.URLSession(configuration: URLSessionConfiguration.default)

        let task = defaultSession.dataTask(with: url)  (data, response, error) in

            if error != nil 
                print("Error")
            else 
                print("stocks downloaded")
                self.parseJSON(data!)
            

        

        task.resume()


    func parseJSON(_ data:Data) 

        var jsonResult = NSArray()

        do
            jsonResult = try JSONSerialization.jsonObject(with: data, options:JSONSerialization.ReadingOptions.allowFragments) as! NSArray

         catch let error as NSError 
            print(error)

        

        var jsonElement = NSDictionary()
        let stocks = NSMutableArray()

        for i in 0 ..< jsonResult.count
        

            jsonElement = jsonResult[i] as! NSDictionary

            let stock = Stockmodel()

            //the following insures none of the JsonElement values are nil through optional binding
            if  let Datum = jsonElement["Datum"] as? String,
                let Tankstelle = jsonElement["Tankstelle"] as? String,
                let Kraftstoff1 = jsonElement["Kraftstoff1"] as? String,
                let Preis1 = jsonElement["Preis1"] as? String,
                let Kraftstoff2 = jsonElement["Kraftstoff2"] as? String,
                let Preis2 = jsonElement["Preis2"] as? String,
                let Notiz = jsonElement["Notiz"] as? String,
                let longitude = jsonElement["longitude"] as? String,
                let latitude = jsonElement["latitude"] as? String


            
                print (Datum)
                print(Tankstelle)
                print(Kraftstoff1)
                print(Preis1)
                print(Kraftstoff2)
                print(Preis2)
                print(Notiz)
                print(longitude)
                print(latitude)
                stock.Datum = Datum
                stock.Tankstelle = Tankstelle
                stock.Kraftstoff1 = Kraftstoff1
                stock.Preis1 = Preis1
                stock.Kraftstoff2 = Kraftstoff2
                stock.Preis2 = Preis2
                stock.Notiz = Notiz
                stock.longitude = longitude
                stock.latitude = latitude


            

            stocks.add(stock)

        

        DispatchQueue.main.async(execute:  () -> Void in

            self.delegate.itemsDownloaded(items: stocks)

        )
    

提前谢谢你:))

代码错误:jsonElement = jsonResult[i] as! NSDictionary

【问题讨论】:

找到导致崩溃的行,因为您显示的代码中似乎没有出现该错误。没有(NS)字典提及。 这是一行:jsonElement = jsonResult[i] as! NSDictionary 还有什么上下文吗?因为你没有写这条线,也没有写出你是如何到达那里的。 jsonResult[i] 等于NSNull,所以不能转换成NSDictionary 对不起,我现在添加了我的 swift 文件,我是一个完全新手,所以我忘记了抱歉 好吧,我做到了 - 拉尔姆 【参考方案1】:

我认为 swift 只连接 https,我这么说是因为我编写了一个 Swift 4 iOS 应用程序来与现有的 android Java 应用程序一起使用(并且都使用 PHP 服务器并通过 json 进行通信)并且我讨厌必须迁移整个服务器到 https 并迁移所有 android 用户。可能有办法解决它,但我认为它现在是一个“东西”。

【讨论】:

您可以创建一个可以连接到 http 或 https 的 iOS 应用程序,但如果您想将应用程序上传到 Apple App Store 他们需要 https,除非您有充分的理由。 好像对,我记得我在发布的时候遇到过,用户需要知道我的回答原则上没有错,重要的是提前知道,不必等到交付阶段

以上是关于对 php 的 Swift 4 Json 请求的主要内容,如果未能解决你的问题,请参考以下文章

Swift 4 上的几个相互依赖的 JSON 请求

请求失败时从 AlamoFire 获取 JSON 响应

对 NSMutableRequest 的 PHP Json 请求!帮助?

使用 php 对 Mysql 的 Ajax JQuery 请求不适用于 JSON

Alamofire json请求Swift 3 [重复]

使用 POST 方法的 Swift 中的 HTTP 请求