サーバー(php)で作成したjsonをswiftで受け取るにはどのようなコードを書けばいいですか?
- 評価
- クリップ 1
- VIEW 473

退会済みユーザー
実現したいこと
サーバーに置いたphpでjson形式のデータを作成して、それをswiftで受け取りたいのですが、受け取ったjsonを格納した後のprint(json)の段階でnilになってしまい受け取れません。ブラウザからは表示されます。エラーは出ていません。print(req_url)でリクエストURLが作成できているのは確認しています。phpにjsonを返すコードが必要な気がするのですがどうやって書けばいいのかわかりません。
import UIKit
class ViewController: UIViewController, UITextFieldDelegate {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
textBar.delegate = self
textBar.placeholder = "next"
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
@IBOutlet weak var textBar: UITextField!
@IBOutlet weak var nowText: UILabel!
// データリスト
var dataList : [(date:String , time:String)] = []
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
textField.resignFirstResponder()
if let queryKey = textField.text {
print(queryKey)
nowmesod(keyword: queryKey)
}
return true
}
struct ItemJson: Codable {
let date: String?
let time: String?
}
struct ResultJson: Codable {
let item:[ItemJson]?
}
// now メソッド
func nowmesod (keyword: String) {
// URLをエンコードする
guard let keyword_encode = keyword.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {
return
}
// リクエストURLの組み立て
guard let req_url = URL(string: "http://localhost/v1.php/now?query=\(keyword_encode)") else {
return
}
print(req_url)
// リクエストに必要な情報を生成
let req = URLRequest(url: req_url)
// データ転送を管理するためにセッションを生成
let session = URLSession(configuration: .default, delegate: nil, delegateQueue: OperationQueue.main)
// リクエストをタスクとして登録
let task = session.dataTask(with: req, completionHandler: {
(data , response , error) in
// セッション終了
session.finishTasksAndInvalidate()
// do try catch エラーハンドリング
do {
// JSONDecoder のインスタンス取得
let decoder = JSONDecoder()
// 受け取ったJSONデータをパース(解析)して格納
let json = try decoder.decode(ResultJson.self, from: data!)
print(json)
// ResultJsonが取得てきているか確認
if let items = json.item {
self.dataList.removeAll()
for item in items {
if let date = item.date , let time = item.time {
let now = (date,time)
self.dataList.append(now)
// 表示
self.nowText.text = "\(now)"
}
}
}
} catch {
print("エラーが出ました")
}
})
task.resume()
}
}
<?php
// エラーを表示
ini_set('display_errors', 1);
// now.phpをインポート
require_once(dirname(__FILE__)."/service_v1/now.php");
if (empty($_SERVER['PATH_INFO'])) {
exit;
}
// URL内で呼ばれたAPIを$callに格納(今回はのnow)
$parse = explode('/', $_SERVER['PATH_INFO']);
$call = "";
foreach ($parse as $value) {
if ($value !== "") {
$call = $value;
break;
}
}
// 呼ばれたAPIのクラスが存在するか確認
if (file_exists('./service_v1/'.$call.'.php')) {
// レスポンスのヘッダにjson,UTF-8,クロスオリジン対策を指定
header("Content-Type: application/json; charset=UTF-8");
header("X-Content-Type-Options: nosniff");
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Headers: Content-Type");
// 呼ばれたAPIごとに処理を分ける
switch ($call) {
case "now":
// クエリの種類を取得
$query = $_GET["query"];
if (!(empty($query))) {
// レスポンス用の変数を定義
$response = '';
// nowクラス(サービス)のインスタンスを作成
$nowApi = new Now();
switch ($query) {
case "all":
$response = $nowApi->getAll();
break;
case "date":
$response = $nowApi->getDate();
break;
case "time":
$response = $nowApi->getTime();
break;
default:
$response = "{\"error\":\"The query is incorrect\"}";
break;
}
echo $response;
}else{
echo "{\"error\":\"The query is not specified\"}";
}
break;
default:
break;
}
}
?>
class Now {
// 現在の日時をjsonにして返却する関数 (引数:なし, 戻り値: json(string))
public function getAll() {
// データを作成
$jsonData = [
"date" => (string) date("Y/m/d"),
"time" => (string) date("H:i:s")
];
// jsonに変換にしてreturn
return json_encode($jsonData);
}
// 現在の日付をjsonにして返却する関数 (引数:なし, 戻り値: json(string))
public function getDate() {
$jsonData = [
"date" => (string) date("Y/m/d")
];
return json_encode($jsonData);
}
// 現在の時間をjsonにして返却する関数 (引数:なし, 戻り値: json(string))
public function getTime() {
$jsonData = [
"time" => (string) date("H:i:s")
];
return json_encode($jsonData);
}
}
?>
コード
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.36%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる