17422


タイトルに書いたように今SwiftからのGETリクエストをcakePHPで受け取る。DB(MySQL)に登録してあるデータをcakePHPからSwiftにデータを送るような流れです。

< Swift >

[code]

        let url = "送信するURL"
        let request = NSMutableURLRequest(URL: NSURL(string:url)!)
        request.HTTPMethod = "GET"
    
        let task = NSURLSession.sharedSession().dataTaskWithRequest(request, completionHandler:{data, response, error in
    
            print(data)
    
            if(error == nil){
                let result = NSString(data:data!,encoding:NSUTF8StringEncoding)!
                //結果を出力(JSON形式)
                print("result=\(result)")
            }else{
                print(error)
            }
    
[/code]

< PHP >

[code]

    //DB接続
    $db = mysql_connect('localhost', 'root', 'imagine');
    
    $table = mysql_select_db('test_db')){
    $table = mysql_query('SET NAMES UTF8')
    
    //テーブルからデータを取り出す
    $table = mysql_query("select id,name,password  from users" , $db)
    
    //レコードごとに配列を取得
    while($row = mysql_fetch_assoc($table)){
    //取得した配列を多次元配列にする。
    $array[] = array($row);
    //json形式でviewに吐く
    $this->set(compact('array'));
    $this->viewClass = 'Json';
    $this->set('_serialize', array('array'));
    
[/code]

Swift側で結果を出力する（`print("result=\(result)")`）と、

[code]

    {"array":[[{"id":"1","name":"My Name","password":"2015-09-29 06:21"}],[{"id":"2","name":"testuser1","password":"1111"}],[{"id":"3","name":"testuser2","password":"2222"}],[{"id":"4","name":"tomorrow","password":"1234"}],[{"id":"5","name":"tomorrow","password":"1234"}],[{"id":"6","name":"test","password":"1234"}],[{"id":"7","name":" the","password":"1234"}],[{"id":"8","name":" the","password":" 1234"}],[{"id":"9","name":" the","password":" the"}],[{"id":"10","name":" people","password":" the"}],[{"id":"11","name":" the","password":" people"}],[{"id":"12","name":" the","password":" I love the"}]]}
    
[/code]

のようにJSON形式でSwiftのデバックエリアに表示するところまではできています。  
しかし、ここから必要な配列の要素だけを表示することができていません。

SwiftyJSONを使って要素を取得することも試してみました。

[code]

            do{
                var data = try NSURLConnection.sendSynchronousRequest(request, returningResponse: nil)
            }catch{
                print("ERROR")
            }
            if data != nil {
                let json = JSON(data: data!)
                print(json)
            }
            if let title = json["array"][0]["id"].string {
                print(title)
            }else{
                print("failed")
            }
    
[/code]

print(json)の結果、print(title)の結果はどちらもnullになってしまいます。

どなたかお力を貸していただけると幸いです。  
説明不足でしたら、随時補足いたします。  
よろしくお願いします。


CC BY-SA 4.0
2015-10-08T07:47:00.297
17417
2019-06-07T23:54:48.503
2019-06-07T23:54:48.503
32986
12470
question
swift php cakephp
SwiftからのGETリクエストをPHPで受け取る。PHPからSwiftへの受け渡し。


`do{~}`の中で`var`を使い変数を再定義しているため，`do{~}`を抜けた時点で変数dataの内容は元に戻り，その後の`let json =
JSON(data: data!)`では空のJSONオブジェクトが生成されてるものと思われます．  
また，`if data != nil {~}`にて変数jsonを`let`にて再定義しているため，正常なJSONオブジェクトが生成されたとしても，`if
data != nil {~}`を抜けた時点で元に戻ってしまうのではないかと思います．  
最後に，Jsonデータを見る限り，`json["array"][0]["id"].string`ではアクセスできないので，`json["array"][0][0]["id"].string`とする必要があると思います．

以上を踏まえて修正すると，

[code]

    var data :NSData? = nil;
    var json :JSON   = nil;
    do{
       data = try NSURLConnection.sendSynchronousRequest(request, returningResponse: nil)
    }catch{
        print("ERROR")
    }
    if data != nil {
        json = JSON(data: data!)
        print(json)
    }
    if let title = json["array"][0][0]["id"].string {
        print(title)
    }else{
        print("failed")
    }
    
[/code]

となるのかなと思います．

### 追記

関数全体のコードを見たところ，リクエストを合計2回送ってしまっているようです．  
`let task = NSURLSession.sharedSession().dataTaskWithRequest`でリクエストを一回，  
`jsonData = try NSURLConnection.sendSynchronousRequest(request,
returningResponse: nil)`で一回となっています．

初めのリクエストの結果dataを用いて，以下のように修正してみてはいかがでしょうか？

[code]

    @IBAction func clibkBtn2(sender: UIButton) {
        var json : JSON = nil
    
        //set url and request
        let url = "http://192.168.33.10/test_app/users/gettest"
        let request = NSMutableURLRequest(URL: NSURL(string:url)!)
        request.HTTPMethod = "GET"
    
        let task = NSURLSession.sharedSession().dataTaskWithRequest(request, completionHandler:{data, response, error in
    
            print(data)
    
            if data != nil {
                json = JSON(data: data!)
                print(json)
            }
    
            if let title = json["array"][0][0]["id"].string {
                print(title)
            }else{
                print("failed")
            }
        })
        task.resume()        
    }
    
[/code]

`NSURLConnection`はdeprecated(非推奨)となっているようです．現在は`NSURLSession`が推奨のようです


CC BY-SA 3.0
2015-10-08T09:10:08.050
17422
2015-10-08T15:26:05.027
2015-10-08T15:26:05.027
7227
7227
17417
answer


> mjhd さん

問題解決致したしました。  
もう一度SwiftyJSONを再配置したところうまくいきました。ご協力ありがとうございます。

[code]

        var json : JSON = nil
    
        //set url and request
        let url = "http://192.168.33.10/test_app/users/gettest"
        let request = NSMutableURLRequest(URL: NSURL(string:url)!)
        request.HTTPMethod = "GET"
    
        let task = NSURLSession.sharedSession().dataTaskWithRequest(request, completionHandler:{data, response, error in
    
            print(data)
            if(error == nil){
                let result = NSString(data:data!,encoding:NSUTF8StringEncoding)!
                //結果を出力(JSON形式)
                //print(result)
                let json = JSON(data: data!)
                print("json = \(json)")
    
            }else{
                print(error)
            }
        })
        task.resume()
    }
    
[/code]


CC BY-SA 3.0
2015-10-09T08:37:10.617
17474
2015-10-09T08:37:10.617
12470
17417
answer