REST化したDjangoアプリを、Swift(Xcode)から叩いてみる

#■開発環境
- Python3
- Django==2.0.6

#■DjangoアプリのREST化

[Django REST Frameworkを使って爆速でAPIを実装する](https://qiita.com/kimihiro_n/items/86e0a9e619720e57ecd8)
こちらを参考に作成してください。

尚、本編ではdjango2でやっているので
プロジェクトのurls.pyを以下のように変えても構いません。

```python:project/urls.py
from django.urls import path
from django.conf.urls import url, include
from django.contrib import admin

from blog.urls import router as blog_router

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/', include(blog_router.urls)),
]
```


#■XcodeでiOSアプリ作成
先ほど作成したDjangoアプリをスマホアプリから叩いてみましょう。

##１、プロジェクト作成
Xcodeを立ち上げます。
Single View Applicarionから、プロジェクトを一つ作成します。
設定はなんでも構いません。
今回project name は　test_restにしました。

##２、インストール
必要モジュールのインストールを行います。

 - Cocoapod
 - Alamofire

[Alamofireの導入および準備](https://qiita.com/ume1126/items/9ec378c02ca1b06287e9)　を参考にインストールしてください。
これで、外部へのアクセスが可能になります。

##３、ボタンとテキストビューの設置
Xcodeを開きます。
まずは中央にUIButtonを設置します。「データベース取得！」
その下にTextViewを設置します。
<img width="248" alt="スクリーンショット 2018-12-14 11.28.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/192887/62036ab4-7c26-7495-abaf-6cc09bd3446f.png">

##４、ボタンのコネクト
ボタンをcontrolを押しながらViewController.swiftに接続します。
場所は、class内の、override func viewDidLoad() {}が閉じたあとです。
今回はpushという関数名で接続しました。

```swift:ViewController.swift
@IBAction func push(_ sender: UIButton) {
    // 郵便番号APIにアクセスする
        Alamofire.request("http://zipcloud.ibsnet.co.jp/api/search?zipcode=7830060").responseJSON {response in

            print("Request: \(String(describing: response.request))")
            print("Response: \(String(describing: response.response))")
            print("Result: \(String(describing: response.result))")
        
            if let json = response.result.value {
                print("JSON: \(json)")  // serialized json response
            }
            if let data = response.data, let utf8Text = String(data: data, encoding: .utf8) {
                print("Data: \(utf8Text)")  // original server data as UTF8 String
            }
            
        }
```

とりあえず郵便番号APIにアクセスしてみます。
この状態でビルドすると、Xcode画面下のコンソールに結果がかえります。
<img width="612" alt="スクリーンショット 2018-12-14 11.35.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/192887/366eb76c-66b5-634a-4bef-1f2302720b38.png">


##５、テキストビューのコネクト
先ほどのUIButtonよりも上にテキストビューをコネクトしておきます。

```swift:ViewController.swift
    @IBOutlet weak var getdata: UITextView!
    //今回繋げたのは↑これ
    
    @IBAction func push(_ sender: UIButton) {
        (略)さっきつなげたやつ。

```

getdataという関数名で繋げておきました。


##６、ボタンを押したらiOS画面に表示させる処理
4で接続した箇所に記述を加えるだけです。
if let dataの中に記述をします。

```swift:ViewController.swift

        (略)

            if let data = response.data, let utf8Text = String(data: data, encoding: .utf8) {
                print("Data: \(utf8Text)")  // original server data as UTF8 String
            
                //ーーーーー追加するのはここから
                var mess:String = ""
                mess += "Data: \(utf8Text)"
                print(mess)
                self.getdata.text = mess
                //ーーーーーここまで

            }
```

ビルドして確認してみましょう。

##☆Error:The resource could not be loaded because the App Transport Security policy requires the use of a secure connection.

なんかエラーがでて、画面が表示されない場合。
iOS9からセキュリティが厳しくなった結果のようです。
ちょまどさんの記事が参考になる。
[【iOS 9 対応】App Transport Security 対策](https://chomado.com/note/tech/app-transport-security/)

ホワイトリストを作ればいいようなので、作ります。

```info.plist
ちょまどさんの、
<key>zipcloud.ibsnet.co.jp</key><!-- ここにHTTP通信を許可するドメイン -->
郵便番号取得先のドメインに変えて保存。
```
実行するとちゃんとアクセスできるはず。
<img width="584" alt="スクリーンショット 2018-12-14 11.47.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/192887/bff504a4-2228-8895-4a5d-466c2aad9ce9.png">


#■DjangoとSwiftの連携
ようやくDjangoのアプリを叩きにいきます。
まずはローカルで動いているDjangoを外部からアクセスできるようにしなければなりません。
ngrokというものを使います。

##１、Djangoアプリ起動
とりあえず、Djangoアプリを8000番ポートで立ち上げておきます。

##２、ngrok
別のターミナルを立ち上げて操作します。

インストール
`brew install ngrok`

起動
`ngrok http 8000`
djangoの場合デフォルトポート番号　8000


```
Forwarding                    http://861d27e8.ngrok.io -> localhost:8000        
Forwarding                    https://861d27e8.ngrok.io -> localhost:8000      
```
画面にこのようなものが出ていると思います。
左側のURLが、今外部からアクセスできるURLになります。
ドメインは、ngrokを起動するたびに乱数発生させて変わります。ngrok有料プランだと固定ドメインを取得できるようです。
実際に`http://861d27e8.ngrok.io`にアクセスすると、djangoアプリをみることができます。

##３、Xcodeからアクセス
XcodeのURL指定する場所に、上記ngrokのURL(apiで叩けるもの)を入れてみます。

```swift:ViewController.swift
@IBAction func push(_ sender: UIButton) {
    // この下！
        Alamofire.request("http://861d27e8.ngrok.io/api/users/1/?format=json").responseJSON {response in
(略)
```

ビルドしてみた結果
<img width="297" alt="スクリーンショット 2018-12-14 12.05.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/192887/91c24046-e346-2939-a7d3-a365cc2b9d6a.png">

うまく取れました。