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だったりするので、そのままコピペだと動きません。