LoginSignup
12
11

More than 5 years have passed since last update.

SwiftでXMLを利用したAPIの送受信(POST)

Posted at

SwiftでXML形式のAPI送受信をする方法がほとんど書かれていなかったので、コードを書いてみました。
外部APIによってはほとんどがJSON形式に対応していると思いますが、APIの都合上XMLでの受け渡しをせざるを得ない場合もあると思うので参考になればと思います。

ちなみに今回はGracenote APIを利用しました
https://developer.gracenote.com/ja/web-api

ViewController.swift
import UIKit

class ViewController: UIViewController ,NSXMLParserDelegate{

    override func viewDidLoad() {
        super.viewDidLoad()

        //XML
        let str = "<QUERIES><AUTH><CLIENT>XXXXXXX-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX</CLIENT><USER>XXXXXXXXXXXXXXXXXX-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX</USER></AUTH><QUERY CMD='ALBUM_SEARCH'><MODE>SINGLE_BEST_COVER</MODE><TEXT TYPE='ARTIST'>perfume</TEXT><TEXT TYPE='ALBUM_TITLE'>GAME</TEXT><TEXT TYPE='TRACK_TITLE'>チョコレイト・ディスコ</TEXT><OPTION><PARAMETER>SELECT_EXTENDED</PARAMETER><VALUE>COVER,REVIEW,ARTIST_BIOGRAPHY,ARTIST_IMAGE,ARTIST_OET,MOOD,TEMPO</VALUE></OPTION><OPTION><PARAMETER>SELECT_DETAIL</PARAMETER><VALUE>GENRE:3LEVEL,MOOD:2LEVEL,TEMPO:3LEVEL,ARTIST_ORIGIN:4LEVEL,ARTIST_ERA:2LEVEL,ARTIST_TYPE:2LEVEL</VALUE></OPTION></QUERY></QUERIES>"

        //UTF-8にエンコード
        let xmlData = str.dataUsingEncoding(NSUTF8StringEncoding)

        //URLの指定
        var url: NSURL! = NSURL(string: "https://c5824512.web.cddbp.net/webapi/xml/1.0/")
        var request = NSMutableURLRequest(URL: url)

        //XMLヘッダーの指定
        request.setValue("application/xml", forHTTPHeaderField: "Content-type")

        //POSTを指定
        request.HTTPMethod = "POST"

        //Dataをセット
        request.HTTPBody = xmlData

        //requestを送信
        NSURLConnection.sendAsynchronousRequest(request,queue: NSOperationQueue.mainQueue(),completionHandler: response)

    }

    //返ってきたAPIのデータを取得
    func response(res: NSURLResponse!, data: NSData!, error: NSError!){

        //XMLに変換
        var parser : NSXMLParser? = NSXMLParser(data: data)
        if parser != nil {
            parser!.delegate = self
            parser!.parse()
        } else {
            // パースに失敗した時
            println("failed to parse XML")
        }

    }

    //取得したXMLをエレメント毎に取得
    func parser(parser: NSXMLParser,didStartElement elementName: String,namespaceURI: String?,qualifiedName: String?,attributes attributeDict: [NSObject : AnyObject])
    {
        println(elementName)
    }

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

XMLファイルを読み込む方法もあると思いますが、XMLも書き換えたりすると思うので直接書きました。

まだまだ勉強不足なのでもっと簡潔に済む方法があるんですかね...

※注意
XXXXXXXの所はクライアントIDだったり、APIKeyだったりするので、そのままコピペだと動きません。

12
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
11