YQL JavaScript メモ その2 restオブジェクト
requestオブジェクトは基本的にrestオブジェクトの作成方法でしかない。restオブジェクトへのアクセスはrequest、y.rest、y.queryのいずれかを使うしかない。
そのrestオブジェクトはプロパティ及びメソッドを持つ。以下はその一覧。
プロパティ
プロパティ | 概要 |
---|---|
headers | headerの連想配列を返す |
url | URLを返す |
queryParams | queryの連想配列を返す |
matrixParams | matrixの連想配列を返す。matrixについてはmethod部分で後述 |
メソッド
accept(content-type)
受け取るデータ形式を指定する
var ret = request.accept("application/json").contentType("application/xml").post(content).response;
contentType(content-type)
送るデータ形式を指定する
var content = <employee> <name>John</name> <id>21</id> </employee>; var ret = request.contentType("application/xml").post(content).response;
del()
HTTP DELETEを実行する。DELETE文で使う。
<delete itemPath="" produces="JSON"> <urls> <url>http://api.mixi-platform.com/2/voice/statuses/{post_id}</url> </urls> <inputs> <key id="oauth_token" type="xs:string" paramType="query" required="true" /> <key id="post_id" type="xs:string" paramType="path" required="true" /> </inputs><execute><![CDATA[response.object = request.del().response;]]></execute> </delete>
fallbackCharset(charset_list)
responseのdecodeの為に「utf-8」「iso-8859-1」の2つがdefaultで設定されているが、これを任意の文字コードで上書きする。
response.object = y.rest(url).fallbackCharset("shift_jis, iso-8859-8, UTF-8, iso-8859-1").get().response;
filterChars()
不正な文字列を削除する。不正な文字列の定義は下記
response.object = y.rest(url).filterChars().get().response;
forceCharset(charset_list)
指定した文字コードでのデコードを強制する。これはresponseやfallbackCharsetメソッドで指定された文字コードより優先される。
y.rest("www.uol.com.br").forceCharset("iso-8859-1").get().response;
get()
指定されたURLに対してGETメソッドを実行する。これはSELECT文でのみ有効。
r = y.rest("yahoo.com").contentType("application/json").get(); response.object = r;
head()
指定されたURLに対してHEADメソッドを実行する。実行結果はheadersプロパティに格納される。
<table xmlns="http://query.yahooapis.com/v1/schema/table.xsd"> <meta> <sampleQuery>select * from {table} where url_path="www.example.com" and header="true";</sampleQuery> </meta> <bindings> <select itemPath="" produces="XML"> <inputs> <key id="url_path" type="xs:string" paramType="variable" required="true" /> <key id="header" type="xs:boolean" paramType="variable"/> </inputs> <execute><![CDATA[ var res = {}; if (header) { res.body = y.rest(url_path).head().headers; } else { res.body = y.rest(url_path).get().response; } response.object = res.body; ]]></execute> </select> </bindings> </table>
header(name, value)
HTTP requestにheaderを追加する
y.include("http://yqlblog.net/samples/base64.js"); var authheader = "Basic " + Base64.encode(username + ":" + password); response.object = request.header("Authorization", authheader).get().response;
jsonCompat(mode)
詳しくはここ。現在引数modeで使えるのは「new」のみ。これでlossless JSONを扱えるようになる。
YQLはweb serviceから得られるデータをxmlで内部処理する。入力と出力が共にJSONであっても同様。この場合JSON→XML→JSONという変換がなされる。このときlossyなデータとなる場合がある。このような事態を避ける時にこのmethodを使用する。
<?xml version="1.0" encoding="UTF-8"?> <table xmlns="http://query.yahooapis.com/v1/schema/table.xsd" securityLevel="any"> <bindings> <select produces="JSON"> <execute><![CDATA[ var api_key = "http://upcoming.yahoo.com/services/api/keygen.php"; var url = "http://upcoming.yahooapis.com/services/rest/?api_key=" + api_key + "&method=event.search&search_text=concert&metro_id=1&format=json"; var a = y.rest(url).get().response; var b = y.rest(url).jsonCompat("new").get().response; y.log(y.jsToString(y.xmlToJson(a))); y.log(y.jsToString(y.xmlToJson(b))); response.object = b; ]]></execute> </select> </bindings> </table>
matrix(name,value)
URLに投げるmatrixを指定すると書いてあるが、matrixってなんぞやと思ったらろくなソースが出てこない。日本語ソースに至っては出てきもしない。どうもかなりマイナーな規格のようだ。
What is MATRIX URL PARAMETER?
URL matrix parameters vs. request parameters]
まあ要するにURLへのparameterの与え方が通常とは違うらしい。
y.rest("http://flower_order_service.com").matrix("flower", "roses").matrix("color", "red").post();
path(path_segment)
指定されたURLにPATHを追加する。
var myData = y.rest("http://blah.com").path("one").path("two").query("a", "b").header("X-TEST","value").get().response;
post(content)
指定されたURLに対してPOSTメソッドを実行する。INSERT、UPDATE、DELETE文で使うと書いてあるが、SELECT文でpostを使う事もあるような気がするんだがどうするんだろう。
var content = {"employee": { "name":"John", "id":21}}; var ret = request.contentType("application/json").post(content).response;
put(content)
指定されたURLに対してPUTメソッドを実行する。INSERT、UPDATE、DELETE文で使う。
url = blogurl + "/xmlrpc.php"; myRequest = y.rest(url); myRequest.contentType("text/xml"); results = myRequest.put('<?xml version="1.0" encoding="UTF-8"?>' + postData.toString()).response;
query(key, value)
URLに投げるqueryを指定する。
var formUrl = "http://example.com/form"; var resp = y.rest(formUrl).query("name", "Tom").post().response;
query(hashmap)
URLに投げるqueryを連想配列で指定する。
var formUrl = "http://example.com/form"; var name = {"name": "John"}; var resp = y.rest(formUrl).query(name).post().response;