Swift 4 Json запрос на переполнение стека

Мне нужна ваша помощь, пожалуйста.
Я пытался написать запрос JSON в Xcode Swift4

JSON Запрос в PHP:

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 Code на моем веб-сервере:

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

Я хочу, чтобы в запросе были быстрые числа.

Это код, в котором мое приложение отображает данные MySQL для моего приложения iOS, и это код, где появляется ошибка.

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

0

Решение

Я думаю, что swift соединяет только https, я говорю это, потому что я написал приложение Swift 4 для iOS, которое сочеталось с существующим Android-приложением для Android (и оба использовали сервер PHP и общались через json), и я ненавидел необходимость переносить весь сервер на https и перенести всех пользователей Android. Там может быть способ обойти это, но я думаю, что это «вещь» сейчас.

-1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]