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()

不正な文字列を削除する。不正な文字列の定義は下記

  • Web Serviceの文字コードに一致しない文字列
  • XMLの仕様に一致しない文字列
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であっても同様。この場合JSONXMLJSONという変換がなされる。このとき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;
timeout(milli_seconds)

ミリ秒でタイムアウトを指定する

y.rest("http://....").timeout(500).get();