ラベル JSON の投稿を表示しています。 すべての投稿を表示
ラベル JSON の投稿を表示しています。 すべての投稿を表示

2007/03/06

BloggerのLabel Feedでエラーが・・。

BetaというかNew Bloggerにはラベル機能があって整理・管理するのに便利なんですが、そのラベル毎にフィードがあるのはご存知でしょうか?

元ネタというか詳しい解説はいつもの如くクリボウさんのページを読んで頂ければと思うのですが、私のこのBlogではラベルフィード機能を使って、記事の下部に「関連のありそうな記事」とかってちょっと間の抜けたLinksを表示しています。

最初は調子良かったのですがレイアウトを修正する為にに何度か自分で試しているとエラーが出ている事がわかりました。


実際にはこの「関連のありそうな記事」は "Bloggerに「関連記事リスト」を。"に書いたように、記事のラベルをLabel FeedをJSONP形式で受け取りその中で日付順の上位5つを現在は表示しています。

Label FeedのURLに関しては上記のクリボウさんのページに"ラベルフィード URL 作成装置"とかも置いてありますのでそちらを参考にしていただくとして、例えばこのBlogで"Blogger"ってラベルのATOM1.0な要約(summary)されたフィードはブラウザにより表示の仕方は変わりますがFirefox2だとこんな感じになります。



上記画像はATOM1.0な形式のフィードに対してFirefoxがスタイル変更をして表示しいますが、ソースはXML形式ですので、これをAJAXな感じでXMLHttpRequestを使って取得して加工し表示って事もありかもしれませんが、フィードのURLが別サイト(www2.blogger.com)になってしまう為、クロスサイトスクリプティング (cross-site scripting) 的なセキュリティー上の問題があり、XMLHttpRequestでは取得する事が出来ません。

ですがBloggerのフィードはJSONそれもCallback指定が可能なJSONPが使えます。Callbackを指定したJSONPなURL<はalt=json-in-scriptとパラメータを指定し、Callbackしてもらう関数名として"callback=任意の関数名"をパラメーターとして指定する形になります。(Javascriptに対してネイティブな形で値を返してくれるので、一手間省けて逆に楽だったりします。)

そのようにして受け取った結果を、今はレイアウトを少し変更しましたので、こんな感じで表示されます。



ですが、これがこんな感じで表示される事があります。



実はこれはJSONPな呼び出しが非同期であり、エラーの検出も困難な為に事前にラベルを列挙して表示しているのです。つまりJSONPな呼び出しが失敗しているんです。

原因はなんだろうとフィードのURLをブラウザで直接開いて見ると、こんなエラー画面が・・・。



別のラベル名で呼び出すとエラーは出ませんが、何度かリロードしてると2~3回でエラーになります。このエラーは暫く時間をおかないと解除されないようで、もしかしたらBloggerの負荷制限なのかとも思っています。

そんな感じで、この件に関してはちょっと情報を漁りつつBloggerに質問してみようかと思います。

Windows VISTAの実環境で使い始めないといけないなぁと思いつつも、勇気と時間がとれなくていまだメインな環境にはインストール出来ない状況です。必要な時間というのは、インストールそのものに必要な時間よりも、その後の設定やトラブルに対処する時間の方です。トラブルってよりも操作方法なり設定が変わった為に出来なくなったり、不具合が出た事に足して対応する時間が惜しいって感じです。以前はそれそのものも楽しめたんですが・・・・・・・・・。

続きを読む・・

2007/02/26

Dojo -- JSONPに挑む。 【白帯編】

取り敢えずAjaxなライブラリとして使い始めたDojoですが、使い方というか流儀みたいなのがそれなりに理解出来たような気がするので、次の一歩としてJSON、それもCross Domainな呼び出しをする為にJSONPをと思っています。

JSONPServiceも他所様のサービスではなく自前で提供をと考えていますので、Server側のArchitectureも合わせて考慮する必要があり、PHPというのがPrivateな利用面ではMajorityなんでしょうが、個人的な好みからASP.NETで挑みます。

Sever側からはベタな手法としてRespone.Write()で手作りとかってのもあるんですが、ここはオシャレなLibraryを使ってみたいと思い、今回はJayrockを使ってみました。


JayrockLGPLでライセンスされており、単純な入出力のFormatter/Parserという面の他に、HTTP Handlerを利用したJSON-RPC的な実装も可能なかなり強力なLibraryです。

今回は取り敢えずJSONPな出力をするaspxなページを取り敢えず作ってみました。Jayrockのサンプルから引用したコードを新規のaspx.csに貼り付けた感じですが、JSONPの動作/雰囲気を掴むにはこんなもので十分かと。

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.IO;
using Jayrock.Json;
using Jayrock.Json.Conversion;

public partial class jsonpTest : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

        string callBackFunctionName = null;

        if (Request["callback"] != null)
        {
            callBackFunctionName = Request["callback"];
            Response.Write(callBackFunctionName + "(");
        }

        using (JsonWriter writer = CreateJsonWriter(Response.Output))
        {
            writer.WriteStartObject();              //  {
            writer.WriteMember("Name");             //      "Name" : 
            writer.WriteString("John Doe");         //          "John Doe",
            writer.WriteMember("PermissionToCall"); //      "PermissionToCall" :
            writer.WriteBoolean(true);              //          true,
            writer.WriteMember("PhoneNumbers");     //      "PhoneNumbers" :
            writer.WriteStartArray();               //          [ 
            WritePhoneNumber(writer,                //            { "Location": "Home",
                "Home""555-555-1234");            //              "Number": "555-555-1234" },
            WritePhoneNumber(writer,                //            { "Location": "Work",
                "Work""555-555-9999 Ext. 123");   //              "Number": "555-555-9999 Ext. 123" }
            writer.WriteEndArray();                 //          ]
            writer.WriteEndObject();                //  }
        }

        if (Request["callback"] != null)
            Response.Write(");");
    }

    private  void WritePhoneNumber(JsonWriter writer, string location, string number)
    {
        writer.WriteStartObject();      //  {
        writer.WriteMember("Location"); //      "Location" : 
        writer.WriteString(location);   //          "...", 
        writer.WriteMember("Number");   //      "Number" :
        writer.WriteString(number);     //          "..."
        writer.WriteEndObject();        //  }
    }

    private  JsonWriter CreateJsonWriter(TextWriter writer)
    {
        JsonTextWriter jsonWriter = new JsonTextWriter(writer);
        jsonWriter.PrettyPrint = true;
        return jsonWriter;
    }
}

ちなみにaspxファイルはこんな感じてデフォルトで作成された物から最初の一行以外は全部削ります。

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="jsonpTest.aspx.cs" Inherits="jsonpTest" %>

そしてクライアントになるhtmlファイルはこんな感じです。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
  <head>
    <script type="text/javascript" src="../dojo/dojo.js"></script>
    <script type="text/javascript">
        
        dojo.require("dojo.io");
        dojo.require("dojo.io.ScriptSrcIO");
        dojo.require("dojo.json");

        function testJSONP() {
        dojo.io.ScriptSrcTransport.bind({
          url: 'http://ilgvkteq.sv05.fsdotnet.net/ngm/jsonpTest.aspx'
          ,transport: "ScriptSrcTransport"
          ,jsonParamName: "callback"
          ,load: function(type, data, event, req) {
            showResult(data);
            }
        });
        }

        function showResult(result) {
            document.getElementById('output').innerHTML =dojo.json.serialize(result);
        }
    </script>
  </head>
  <body>

    <input type="button" onclick="testJSONP()" value="Test JSONP"/>
    <br /><br /><br />
    <div id="output"></div>

  </body>

</html>

このBloggerPost(記事)にはScriptを埋められないので、動作してる画面はこんな感じ。



ボタンを押すと、



かなり手抜きなテストですが、SeverからのResponseJavascriptObjectとして捕らえられている事とCallBackの指定の仕方が分かるので、白帯編としてはこれで十分かと。

この次は茶帯編として、JSONPで得た結果からGridの描画とかをと思っています。

続きを読む・・