HTTPで通信する(GET)

壁ドン

 サーバー・クライアントにおける基本的に通信プロトコルとしてHTTPがあります。HTTPはWebサイトの閲覧などに使用されている基本的なプロトコルです。ここではこのHTTPをiOSで制御する方法について学びます。URLを指定してGET命令をして、htmlファイルを取得し表示するプログラムを作ります。

HTTP通信とは

 HTTPとはHypertext Transfer Protocolの頭文字をとったものです。日本語で「ハイパーテキスト転送プロトコル」 で、Webページみる際の決まりのことだと思っていただければいいです。HTTP通信はサーバーとクライアントが接続した状況から始まります。クライアントが以下の命令によりサーバーから情報を取得できます。

命令 意味
GET 指定したURLのデータを取得する
POST 指定したURLへデータを送る
PUT 指定したRULにデータを保存する
DELETE 指定したURLのデータを削除する
HEAD メッセージヘッダのみを取得すr
TRACE リクエストメッセージをクライアントに戻す
OPTIONS オプション設定

 いろいろ命令がありますが、よく使用する命令はGETとPOSTです。今回はGETという命令を使ってサーバーからhtmlを取得します。

GETの動作

 GET命令ではまず、クライアントが以下のようなメッセージを送ります。

GET /Default.html HTTP/1.0

これは、Default.htmlがほしいという命令になります。HTTP/1.0はHTTPのバージョンを示します。この命令をするとサーバー側がDefalt.htmlを探して以下のように返答します。

HTTP/1.0 200 OK
MIME-Version: 1.0

<html>…

 はじめのHTTP/1.0 200 OK以降がヘッダーと呼ばれる項です。ここに応答の情報が含まれています。そして、<html>以降にファイルの情報が含まれます。

URLからhtmlを取得するプログラムを作る

 HTTP通信にはGETやPOSTという命令があります。ここではGET命令を使って指定したURLからhtmlを取得するプログラムを作ります。

プロジェクトの作成

 Xcodeを立ちあげて「Create a new Xcode project」を選択します。

createnewproject

iOSのSingle View Applicationを選びます。

singleview

プロジェクト名と言語を指定します。ここではSwiftとして話を進めます。

3

UIの設計

 Text Field、Button、Text Viewを以下のように配置します。

view

 そして、Contstraintsを設定して、画面が変更しても崩れないようにします。ここでは、Text FieldとButtonに左右、上の制限、Text Viewに上下左右の制限をいれました。

 次に、2画面にして、メソッドとプロパティをViewController.swiftへ追加します。

  1. Text Field:プロパティ名「input_url」
  2. Button:メソッド名「get」
  3. Text View:プロパティ名「show」

プログラムをつくる

 以下の用にViewController.swiftをコーディングします。

import UIKit

class ViewController: UIViewController {
    @IBOutlet var input_url: UITextField!
    @IBOutlet var show: UITextView!
    @IBAction func get(sender: UIButton) {
        let URL=NSURL(string: input_url.text)
        let request=NSURLRequest(URL: URL!)
        NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue(), completionHandler: self.response)
    }

    func response(res: NSURLResponse!, data:NSData!, error:NSError!){
        if error == nil{
            show.text=NSString(data: data,encoding: NSUTF8StringEncoding)
        }else{
            show.text="通信エラー"
        }

    }

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        input_url.text="http://jprogramer.com/"
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

}

 HTTP通信を行うには以下の命令を使用します。

HTTP通信GET

func sendAsynchronousRequest(request: NSURLRequest, queue: NSOperationQueue!, handler: ((NSURLResponse!, NSData!, NSError!) -> Void)!)

 requestにより指定したURLにGETメッセージを送る。メッセージを取得するとhandlerで指定した関数が実行される。

この命令によって、サーバーからメッセージが届くと関数rewponseが実行されます。

実行結果

 初期条件の画面は以下の通りです。

syoki

URLを記入してGETを押せば、htmlが表示されます。

get

著者:安井 真人(やすい まさと)