So-net blog AtomAPI仕様


本ページでは、So-net blogにおける AtomAPI 実装を解説いたします。

○利用にあたってのご注意
Atomプロジェクトが定めるAtomAPI仕様はドラフトとなります(2005年6月現在)。そのため、So-net blogのAtomAPI実装およびこのページの内容は変更になる可能性があります。

■index■
  1. AtomAPIとは
  2. So-net blog のAtomAPI実装概要
  3. AtomAPIの認証
  4. ルートエンドポイント
  5. 記事用AtomAPI(blogサービス)へのリクエスト・レスポンス
    1. 記事用AtomAPIのルートエンドポイント
    2. 記事の参照
    3. 記事の複数参照
    4. 記事の新規作成
    5. 記事の編集
    6. 記事の削除
  6. 画像用AtomAPI(imageサービス)へのリクエスト・レスポンス
    1. 画像用AtomAPIのルートエンドポイント
    2. 画像の参照
    3. 画像の複数参照
    4. 画像の登録
    5. 画像の編集
    6. 画像の削除
  7. エラーレスポンスコード
    1. 400 Bad Request
    2. 401 Unauthorized
    3. 403 Forbidden
    4. 405 Method Not Allowed

AtomAPIとは

「AtomAPI」は、Webページ上に記事/画像を投稿、編集するためのアプリケーション・プロトコル仕様です。 So-net blogのAtomAPIを利用することで、ソフトウェアの開発者は、So-net blogに対し、記事/画像の参照、投稿、編集、削除などを行うアプリケーションを制作することが可能となります。


So-net blog のAtomAPI実装概要

特定のURIに対してHTTPのGET、POST、PUT、DELETEを行い、そのリクエストに規定のXMLを加えて送信すると、So-net blogのAtomAPIで用意した操作を行うことができます。

現時点でSo-net blogのAtomAPIがサポートしている操作は以下となります。

  • 記事用AtomAPI
    • 記事の新規作成(PostURIへのPOST)
    • 記事の編集(EditURIへのPUT)
    • 記事の削除(EditURIへのDELETE)
    • 記事の参照(FeetURIへのGET)
    • 記事のページ送り(FeetURIへのGET)
  • 画像用AtomAPI

    • 画像の新規作成(PostURIへのPOST)
    • 画像の削除(EditURIへのDELETE)
    • 画像の参照(FeetURIへのGET)
    • 画像のページ送り(FeetURIへのGET)

AtomAPIの認証

So-net blogのAtomAPIの利用にはWSSE認証が必須です(現時点ではBasic認証に対応していません)。 WSSE認証の詳細に関しては http://www-128.ibm.com/developerworks/webservices/library/ws-secure/ (英語) をご参照ください。

WSSE認証とは、認証用文字列をHTTPのX-WSSEヘッダを用いて送信する認証方式です。WSSE認証用文字列にはユーザー名とパスワードが含まれ、パスワードはSHA1アルゴリズムによって暗号化されたダイジェストとして送信されます。そのため、Basic認証などと比較して、よりセキュアな認証が可能となります。


ルートエンドポイント

ルートエンドポイントは記事用と画像用を用意しました。各エンドポイントのURLは以下です。

記事用AtomAPI(blogサービス)へのリクエスト・レスポンス


記事用AtomAPIのルートエンドポイント

ルートエンドポイントに対しGETリクエストを行うことで、PostURIとFeedURI、UploadURIを取得することができます。
  • リクエスト

    GET /_atom/blog HTTP/1.1 X-WSSE: UsernameToken Username="user_name", PasswordDigest="fSzKHSagDuwiAWR092gIteMLgwo=", Nonce="MmtxM2Z2aTV0djQx", Created="2005-06-04T13:44:30Z" Host: blog.so-net.ne.jp
  • レスポンス

    HTTP/1.1 200 OK
    Set-Cookie: JSESSIONID=495E014F911B7CC026F0ADA879F9CEC8; Path=/
    Content-Type: application/x.atom+xml;charset=UTF-8
    Content-Length: 364
    Date: Sat, 04 Jun 2005 22:27:05 GMT
    Server: Apache-Coyote/1.1

    <?xml version="1.0" encoding="utf-8"?>
    <feed xmlns="http://purl.org/atom/ns#">
        <link rel="service.post" href="http://blog.so-net.ne.jp/_atom/blog/1" type="application/x.atom+xml" title="user_nameのブログ" />
        <link rel="service.feed" href="http://blog.so-net.ne.jp/_atom/blog/1" type="application/x.atom+xml" title="user_nameのブログ" />
        <link rel="service.upload" href="http://blog.so-net.ne.jp/_atom/image/1" type="application/x.atom+xml" title="user_nameのブログ" />
    </feed>

記事の参照

FeetURIへのGETリクエストを行うことで記事の参照ができます。
  • リクエスト

    GET /_atom/blog/1 HTTP/1.1
    X-WSSE: UsernameToken Username="user_name", PasswordDigest="fSzKHSagDuwiAWR092gIteMLgwo=", Nonce="MmtxM2Z2aTV0djQx", Created="2005-06-04T13:44:30Z"
    Host: blog.so-net.ne.jp
  • レスポンス

    HTTP/1.1 200 OK
    Set-Cookie: JSESSIONID=AD47D10B4411862A8F66AB1DFFE39A7F; Path=/
    Content-Type: application/x.atom+xml;charset=UTF-8
    Content-Language: ja-JP
    Transfer-Encoding: chunked
    Date: Sat, 04 Jun 2005 23:07:00 GMT
    Server: Apache-Coyote/1.1

    <?xml version="1.0" encoding="utf-8"?>
    <feed xmlns="http://purl.org/atom/ns#">

        <id>tag:blog.so-net.ne.jp,2005:blog/1</id>

        <link rel="alternate" type="text/html" href="http://blog.so-net.ne.jp/user_name" />
        <link rel="service.post" href="http://blog.so-net.ne.jp/_atom/blog/1" type="application/x.atom+xml" title="user_nameのブログ" />
        <link rel="start" href="http://blog.so-net.ne.jp/_atom/blog/1" type="application/x.atom+xml" title="user_nameのブログ" />

        <title>user_nameのブログ</title>

        <author>
            <name>nickname</name>
        </author>

        <entry>
            <title>aaa</title>
            <link rel="alternate" type="text/html" href="http://blog.so-net.ne.jp/user_name/2005-06-05-1" />
            <link rel="service.edit" href="http://blog.so-net.ne.jp/_atom/blog/1/50" type="application/x.atom+xml" title="aaa" />
            <link rel="service.feed" href="http://blog.so-net.ne.jp/_atom/blog/1/50" type="application/x.atom+xml" title="aaa" />
            <modified>2005-06-04T21:28:45Z</modified>
            <issued>2005-06-04T21:28:45Z</issued>
            <id>tag:blog.so-net.ne.jp,2005:blog/1/50</id>
            <content type="text/html" mode="escaped" xml:lang="ja" xml:base="http://blog.so-net.ne.jp/user_name/2005-06-05-1">
        bbb
            </content>
        </entry>

        <entry>
            <title>aba&#034;aaa&lt;b&gt;b&amp;a&amp;abc</title>
            <link rel="alternate" type="text/html" href="http://blog.so-net.ne.jp/user_name/2005-05-18-1" />
            <link rel="service.edit" href="http://blog.so-net.ne.jp/_atom/blog/1/4" type="application/x.atom+xml" title="aba&#034;aaa&lt;b&gt;b&amp;a&amp;abc" />
            <link rel="service.feed" href="http://blog.so-net.ne.jp/_atom/blog/1/4" type="application/x.atom+xml" title="aba&#034;aaa&lt;b&gt;b&amp;a&amp;abc" />
            <modified>2005-06-02T23:28:03Z</modified>
            <issued>2005-06-02T23:28:03Z</issued>
            <id>tag:blog.so-net.ne.jp,2005:blog/1/4</id>
            <content type="text/html" mode="escaped" xml:lang="ja" xml:base="http://blog.so-net.ne.jp/user_name/2005-05-18-1">
        &lt;strong&gt;b&amp;amp;a&amp;amp;abc&lt;/strong&gt;
            </content>
        </entry>

    </feed>

記事の複数参照

現在は20件ずつ表示しており,relがstart,div prev,nextのlink要素からURLを取得します。
  • リクエスト

    GET /_atom/blog/1/offset=3 HTTP/1.1
    X-WSSE: UsernameToken Username="user_name", PasswordDigest="fSzKHSagDuwiAWR092gIteMLgwo=", Nonce="MmtxM2Z2aTV0djQx", Created="2005-06-04T13:44:30Z"
    Host: blog.so-net.ne.jp
  • レスポンス

    HTTP/1.1 200 OK
    Set-Cookie: JSESSIONID=9E40811F655C4730F367AF5A1A547D54; Path=/
    Content-Type: application/x.atom+xml;charset=UTF-8
    Content-Language: ja-JP
    Content-Length: 7196
    Date: Sat, 04 Jun 2005 23:17:39 GMT
    Server: Apache-Coyote/1.1

    <?xml version="1.0" encoding="utf-8"?>
    <feed xmlns="http://purl.org/atom/ns#">
        <id>tag:blog.so-net.ne.jp,2005:blog/1</id>

        <link rel="alternate" type="text/html" href="http://blog.so-net.ne.jp/user_name" />
        <link rel="service.post" href="http://blog.so-net.ne.jp/_atom/blog/1" type="application/x.atom+xml" title="user_nameのブログ" />
        <link rel="start" href="http://blog.so-net.ne.jp/_atom/blog/1" type="application/x.atom+xml" title="user_nameのブログ" />
        <link rel="prev" href="http://blog.so-net.ne.jp/_atom/blog/1/offset=0" type="application/x.atom+xml" title="user_nameのブログ" />
        <link rel="next" href="http://blog.so-net.ne.jp/_atom/blog/1/offset=23" type="application/x.atom+xml" title="user_nameのブログ" />

        <title>user_nameのブログ</title>

        <author>
            <name>nickname</name>
        </author>

        <entry>(省略)</entry>
        <entry>(省略)</entry>
        <entry>(省略)</entry>

    </feed>

記事の新規作成

PostURIにPOSTリクエストすることで記事の新規作成ができます。
  • リクエスト

    POST /_atom/blog/1 HTTP/1.1
    X-WSSE: UsernameToken Username="user_name", PasswordDigest="iqewCZA5Aqh0z2E2vgUkyzxxK90=", Nonce="cnFlY2Vpcmk5OXpx", Created="2005-06-04T23:24:52Z"
    Host: blog.so-net.ne.jp
    Content-Length: 281

    <?xml version="1.0"?>
    <entry xmlns="http://purl.org/atom/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
        <title type="text/html" mode="escaped">title</title>
        <issued>2005-06-05T01:17:32</issued>
        <content type="text/html" mode="escaped" xml:lang="ja-JP">body</content>
    </entry>
  • レスポンス

    HTTP/1.1 201 Created
    Set-Cookie: JSESSIONID=9333F56FC838A8B770985A191D6B74C3; Path=/
    Content-Type: application/x.atom+xml;charset=UTF-8
    Content-Length: 632
    Date: Sat, 04 Jun 2005 23:29:22 GMT
    Server: Apache-Coyote/1.1

    <?xml version="1.0" encoding="utf-8"?>
    <entry xmlns="http://purl.org/atom/ns#">
        <title>title</title>

        <link rel="alternate" type="text/html" href="http://blog.so-net.ne.jp/user_name/2005-06-05-3" />
        <link rel="service.edit" type="application/x.atom+xml" href="http://blog.so-net.ne.jp/_atom/blog/1/54" title="title" />

        <modified>2005-06-04T15:00:00Z</modified>
        <issued>2005-06-04T15:00:00Z</issued>
        <id>tag:blog.so-net.ne.jp,2005:blog/1/54</id>

        <author>
            <name>nickname</name>
        </author>

        <content type="text/html" mode="escaped" xml:lang="ja" xml:base="http://blog.so-net.ne.jp/user_name/2005-06-05-3">
    body
        </content>
    </entry>

記事の編集

EditURIに対してPUTリクエストを行うことで記事の編集ができます。
  • リクエスト

    PUT /_atom/blog/1/54 HTTP/1.1
    X-WSSE: UsernameToken Username="user_name", PasswordDigest="iqewCZA5Aqh0z2E2vgUkyzxxK90=", Nonce="cnFlY2Vpcmk5OXpx", Created="2005-06-04T23:24:52Z"
    Host: blog.so-net.ne.jp
    Content-Length: 299

    <?xml version="1.0"?>
    <entry xmlns="http://purl.org/atom/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
        <title type="text/html" mode="escaped">Modified title</title>
        <issued>2005-06-05T01:17:32</issued>
        <content type="text/html" mode="escaped" xml:lang="ja-JP">Modified body</content>
    </entry>
  • レスポンス

    HTTP/1.1 200 OK
    Set-Cookie: JSESSIONID=1062725943D012E89326086CAE9824A7; Path=/
    Content-Type: text/html
    Content-Length: 0
    Date: Sat, 04 Jun 2005 23:34:39 GMT
    Server: Apache-Coyote/1.1

記事の削除

EditURIに対してDELETEリクエストを行うことで記事の削除ができます。
  • リクエスト

    DELETE /_atom/blog/1/54 HTTP/1.1
    X-WSSE: UsernameToken Username="user_name", PasswordDigest="iqewCZA5Aqh0z2E2vgUkyzxxK90=", Nonce="cnFlY2Vpcmk5OXpx", Created="2005-06-04T23:24:52Z"
    Host: blog.so-net.ne.jp
  • レスポンス

    HTTP/1.1 200 OK
    Set-Cookie: JSESSIONID=09213086A0CD1CE2DB2592E21F6483A0; Path=/
    Content-Type: text/html
    Content-Length: 0
    Date: Sat, 04 Jun 2005 23:36:33 GMT
    Server: Apache-Coyote/1.1

画像用AtomAPI(imageサービス)へのリクエスト・レスポンス


画像用AtomAPIのルートエンドポイント

ルートエンドポイントに対しGETリクエストを行うことで、PostURIとFeedURIを取得することができます。
  • リクエスト

    GET /_atom/image HTTP/1.1
    X-WSSE: UsernameToken Username="user_name", PasswordDigest="fSzKHSagDuwiAWR092gIteMLgwo=", Nonce="MmtxM2Z2aTV0djQx", Created="2005-06-04T13:44:30Z"
    Host: blog.so-net.ne.jp
  • レスポンス

    HTTP/1.1 200 OK
    Set-Cookie: JSESSIONID=95D2550348816087EDEB126A02F2B2D2; Path=/
    Content-Type: application/x.atom+xml;charset=UTF-8
    Content-Length: 296
    Date: Sat, 04 Jun 2005 23:42:44 GMT
    Server: Apache-Coyote/1.1

    <?xml version="1.0" encoding="utf-8"?>
    <feed xmlns="http://purl.org/atom/ns#">
        <link rel="service.post" href="http://blog.so-net.ne.jp/_atom/image/1" type="application/x.atom+xml" />
        <link rel="service.feed" href="http://blog.so-net.ne.jp/_atom/image/1" type="application/x.atom+xml" />
    </feed>

画像の参照

FeedURIにGETリクエストを行うことで画像の参照ができます。
  • リクエスト

    GET /_atom/image/1 HTTP/1.1
    X-WSSE: UsernameToken Username="user_name", PasswordDigest="fSzKHSagDuwiAWR092gIteMLgwo=", Nonce="MmtxM2Z2aTV0djQx", Created="2005-06-04T13:44:30Z"
    Host: blog.so-net.ne.jp
  • レスポンス

    HTTP/1.1 200 OK
    Set-Cookie: JSESSIONID=C32AD8061189AA9B5B399C7F13A03669; Path=/
    Content-Type: application/x.atom+xml;charset=UTF-8
    Content-Language: ja-JP
    Content-Length: 5121
    Date: Sat, 04 Jun 2005 23:44:26 GMT
    Server: Apache-Coyote/1.1

    <?xml version="1.0" encoding="utf-8"?>
    <feed xmlns="http://purl.org/atom/ns#">

        <id>tag:blog.so-net.ne.jp,2005:image/1</id>

        <link rel="service.post" href="http://blog.so-net.ne.jp/_atom/image/1" type="application/x.atom+xml" title="user_nameのブログ" />
        <link rel="start" href="http://blog.so-net.ne.jp/_atom/image/1" type="application/x.atom+xml" title="user_nameのブログ" />

        <title>user_nameのブログ</title>

        <author>
            <name>nickname</name>
        </author>

        <entry>
            <title>user_name/15</title>
            <link rel="alternate" type="image/png" href="http://blog.so-net.ne.jp/_images/blog/user_name/15.png" />
            <link rel="service.edit" href="http://blog.so-net.ne.jp/_atom/image/1/15" type="application/x.atom+xml" title="user_name/15" />
            <link rel="service.feed" href="http://blog.so-net.ne.jp/_atom/image/1/15" type="application/x.atom+xml" title="user_name/15" />
            <id>tag:blog.so-net.ne.jp,2005:image/1/15</id>
        </entry>

        <entry>
            <title>user_name/14</title>
            <link rel="alternate" type="image/gif" href="http://blog.so-net.ne.jp/_images/blog/user_name/14.gif" />
            <link rel="service.edit" href="http://blog.so-net.ne.jp/_atom/image/1/14" type="application/x.atom+xml" title="user_name/14" />
            <link rel="service.feed" href="http://blog.so-net.ne.jp/_atom/image/1/14" type="application/x.atom+xml" title="user_name/14" />
            <id>tag:blog.so-net.ne.jp,2005:image/1/14</id>
        </entry>

        <entry>
            <title>user_name/13</title>
            <link rel="alternate" type="image/jpeg" href="http://blog.so-net.ne.jp/_images/blog/user_name/13.jpg" />
            <link rel="service.edit" href="http://blog.so-net.ne.jp/_atom/image/1/13" type="application/x.atom+xml" title="user_name/13" />
            <link rel="service.feed" href="http://blog.so-net.ne.jp/_atom/image/1/13" type="application/x.atom+xml" title="user_name/13" />
            <id>tag:blog.so-net.ne.jp,2005:image/1/13</id>
        </entry>

    </feed>

画像の複数参照

記事の複数参照と同様。

画像の登録

PostURIにPOSTリクエストを行うことで画像の新規作成(登録)ができます。
  • リクエスト

    POST /_atom/image/1 HTTP/1.1
    X-WSSE: UsernameToken Username="user_name", PasswordDigest="fSzKHSagDuwiAWR092gIteMLgwo=", Nonce="MmtxM2Z2aTV0djQx", Created="2005-06-04T13:44:30Z"
    Host: blog.so-net.ne.jp
    Content-Type: application/x.atom+xml
    Content-Length: 8046

    <?xml version="1.0" encoding="EUC-JP"?>
    <entry xmlns="http://purl.org/atom/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
        <content type="image/jpg" mode="base64">
    /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAA0JCgsKCA0LCwsPDg0QFCEVFBISFCgdHhghMCoyMS8q
    Li00O0tANDhHOS0uQllCR05QVFVUMz9dY1xSYktTVFH/2wBDAQ4PDxQRFCcVFSdRNi42UVFRUVFR
    ~~~~~~~~~~~~~~~~~~~ (省略) ~~~~~~~~~~~~~~~~~~
    NHhK41KRZPEerzagqnItox5UIPuB9768V1dFAEcEENtCkNvEkUSDCogwAPYVJRRQAUUUUAFFFFAH
    /9k=
        </content>
    </entry>
  • レスポンス

    HTTP/1.1 201 Created
    Set-Cookie: JSESSIONID=073A792EB963DDE899334D8ECB78E6E6; Path=/
    Content-Type: application/x.atom+xml;charset=UTF-8
    Content-Length: 433
    Date: Sat, 04 Jun 2005 23:51:24 GMT
    Server: Apache-Coyote/1.1

    <?xml version="1.0" encoding="utf-8"?>
    <entry xmlns="http://purl.org/atom/ns#">

        <title>user_name/17</title>

        <link rel="alternate" type="image/jpeg" href="http://blog.so-net.ne.jp/_images/blog/user_name/17.jpg" />
        <link rel="service.edit" type="application/x.atom+xml" href="http://blog.so-net.ne.jp/_atom/image/1/17" title="user_name/17"/>

        <id>tag:blog.so-net.ne.jp,2005:image/1/17</id>

        <author>
            <name>nickname</name>
        </author>

    </entry>
  • titleは仮につけたものです。ユーザの入力を反映しません。

画像の編集

画像の置き換え(編集)はサポートしていません。


画像の削除

EditURIに対してDELETEリクエストを行うことで画像の削除ができます。



エラーレスポンスコード


400 Bad Request

  • 渡されたXMLドキュメントのパースに失敗した場合。

    HTTP/1.1 400
    Content-Type: application/x.atom+xml;charset=UTF-8
    Transfer-Encoding: chunked
    Date: Sun, 05 Jun 2005 21:43:34 GMT
    Server: Apache-Coyote/1.1
    Connection: close

    <?xml version="1.0" encoding="UTF-8"?>
    <error>XML parse failed.</error>

401 Unauthorized

  • WSSE認証に失敗した場合。

    HTTP/1.1 401 X-WSSE authentication required
    Content-Type: application/x.atom+xml;charset=UTF-8
    Transfer-Encoding: chunked
    Date: Sun, 05 Jun 2005 19:55:46 GMT
    Server: Apache-Coyote/1.1

    <?xml version="1.0" encoding="UTF-8"?>
    <error>X-WSSE authentication required</error>

403 Forbidden

  • 記事/画像が存在しない場合。
  • 記事/画像が自分のものでなかった場合。
  • 画像の最大サイズを超過した場合。
  • 画像の合計アップロードサイズを超過した場合。
    HTTP/1.1 403 Forbidden
    Content-Type: application/x.atom+xml;charset=UTF-8
    Transfer-Encoding: chunked
    Date: Sun, 05 Jun 2005 21:37:52 GMT
    Server: Apache-Coyote/1.1

    <?xml version="1.0" encoding="UTF-8"?>
    <error>Forbidden</error>

405 Method Not Allowed

  • 画像をPUTしようとした場合。