对 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 请求的主要内容,如果未能解决你的问题,请参考以下文章
对 NSMutableRequest 的 PHP Json 请求!帮助?