HowTo: Einführung in die MetaWebLogAPI

imageDieser Blogpost basiert auf Scott Hanselmans “WeeklySourceCode”, wo diese Woche das Thema MetaWebLogAPI dran kam. In dem Blogpost berichtet er, dass MS auch intern zum Verwalten ihrer Seiten den Windows Live Writer nutzen. Das Tool ist absolut praktisch und ist “MetaWebLogAPI” kompatibel. Durch diese API ist es z.B. möglich mit Standard Tools (Word oder den Windows Live Writer) “CMS” Content zu erzeugen.

Was nützt mir das?

Der normale Endanwender mag ein einfachen WYSIWYG Editor haben. Es gibt einige nette Editoren, wie z.B. tinyMCE. Das größte Problem was ich bislang mit solchen Web-basierten Lösungen habe ist, dass der Umgang mit Bildern meistens Arg abenteuerlich gestaltet ist. Der normale User mag es, einfach die Bilder per Copy and Paste ins Word zu verschieben und dort noch ein paar Effekte anzustellen. Wenn man nun selber Webseitenbetreiber ist und seinen Kunden ein “einfaches” Frontend zur Verfügung stellen möchte, der kann die MetaWebLog API implementieren.

Standard Tools

Der große Vorteil ergibt sich durch die netten Clients. Auf der einen Seite gibt es z.B. den Windows Live Writer:

image

Aber auch Word ab der Version 2007:

image

In diesen Tools kann man einfach aus der Zwischenablage Bilder etc. einfügen und entsprechend editieren. Erst beim “Veröffentlichen” werden die Daten zum Server übertragen.

Technischer Hintergrund: XmlRPC

Die MetaWebLog API basiert nicht auf SOAP, sondern auf XML Remote Process Call (RPC). Im Grunde wird dort auch nur XML übertragen. Ein Beispiel von Wikipedia:

<?xml version="1.0"?>
<methodCall>
  <methodName>examples.getStateName</methodName>
  <params>
    <param>
        <value><i4>40</i4></value>
    </param>
  </params>
</methodCall>

Dafür gibt es auch einen .NET Wrapper.

Die MetaWebLog API hat ein festes Set an Methoden. Dafür wurde bereits im Jahre 2008 von Keyvan Nayyeri eine Schnittstelle für ASP.NET.

namespace NotABlog
{
    public interface IMetaWeblog
    {
        #region MetaWeblog API

        [XmlRpcMethod("metaWeblog.newPost")]
        string AddPost(string blogid, string username, string password, Post post, bool publish);

        [XmlRpcMethod("metaWeblog.editPost")]
        bool UpdatePost(string postid, string username, string password, Post post, bool publish);

        [XmlRpcMethod("metaWeblog.getPost")]
        Post GetPost(string postid, string username, string password);

        [XmlRpcMethod("metaWeblog.getCategories")]
        CategoryInfo[] GetCategories(string blogid, string username, string password);

        [XmlRpcMethod("metaWeblog.getRecentPosts")]
        Post[] GetRecentPosts(string blogid, string username, string password, int numberOfPosts);

        [XmlRpcMethod("metaWeblog.newMediaObject")]
        MediaObjectInfo NewMediaObject(string blogid, string username, string password, MediaObject mediaObject);

        #endregion

        #region Blogger API

        [XmlRpcMethod("blogger.deletePost")]
        [return: XmlRpcReturnValue(Description = "Returns true.")]
        bool DeletePost(string key, string postid, string username, string password, bool publish);

        [XmlRpcMethod("blogger.getUsersBlogs")]
        BlogInfo[] GetUsersBlogs(string key, string username, string password);

        [XmlRpcMethod("blogger.getUserInfo")]
        UserInfo GetUserInfo(string key, string username, string password);

        #endregion
    }
}

Diese Schnittstelle hat ScottHa in seinem Demoprojekt implementiert, so z.B. :

string IMetaWeblog.AddPost(string blogid, string username, string password,
    Post post, bool publish)
{
    if (ValidateUser(username, password))
    {
        string id = string.Empty;
        string postFileName;
        if (String.IsNullOrEmpty(post.title))
            postFileName = Guid.NewGuid() + ".html";
        else
            postFileName = post.title + ".html";

        File.WriteAllText(Path.Combine(LocalPublishPath, postFileName), post.description);

        return postFileName;
    }
    throw new XmlRpcFaultException(0, "User is not valid!");
}

Da ich mich fragte, was mit Bildern geschieht: Diese kommen in der Methode “NewMediaObject” an und können dort als byte Array verarbeitet werden.

Demoprojekt gibts bei ScottHa

Wie bereits gesagt, basiert dieser Post auf dem Post von Scott. Er hat auch sein Demoprojekt veröffentlicht und Daten die ich vom Windows Live Writer oder Word abschicke kommen auch bei den entsprechenden Methoden an.


Kick It auf dotnet-kicks.de
Wenn dir der Blogpost gefallen hat, dann hinterlasse doch einen Kommentar. Wenn du auf dem Laufenden bleiben willst, abonniere unseren RSS Feed oder folge uns auf Twitter.

About the author

Written by Robert Mühsig

Robert Mühsig (@robert0muehsig) ist Webentwickler und beschäftigt sich mit Web-Frameworks (vor allem dem ASP.NET MVC Framework) und scheut sich auch nicht vor Javascript. Ansonsten bloggt er über all jene Probleme, die ihm über den Weg laufen. Seit 2008 ist er Microsoft MVP für ASP.NET und er arbeitet bei der T-Systems Multimedia Solutions GmbH in Dresden. Treffen kann man ihn online via Twitter (@robert0muehsig) oder dieser Seite oder bei der .NET User Group Dresden.

Comment on this post

Letzte Posts

  • Carriage Return / Neue Zeile in Textareas

    Eine kleine Aufgabe: Jede neue Textzeile (Carriage Return/Wenn man Enter drückt ) in einer Textarea soll ein Element in einer Auflistung sein – wie mach ich das jetzt am einfachsten? Eigentlich ein grundlegendes Element im Web und der Nutzer macht bewusst Absätze – daher wäre es nur gerecht, wenn man das auch entsprechend würdigt. Kleine ...

  • image.png
    Doom, Quake, Wolfenstein & co. Source Code auf GitHub

    id Software, die Macher von Doom, Quake, Wolfenstein & co., stellen regelmäßig ihre älteren Spieltitle als Open Source zur Verfügung. Das Ganze runterzuladen fand ich bisher immer recht mühselig, allerdings gibt es seit kurzer Zeit die Sourcen auch auf GitHub. Darunter Spiele wie Doom 3, Quake 3, Wolfenstein für iOS. Wer also schon immer mal ...

  • image.png
    Twitter Bootstrap 2.0 released & “Release Präsentation”

    Wie bereits vom Twitter Bootstrap Team angekündigt wurde offiziel die Version 2.0 des UI Toolskits “Twitter Bootstrap” veröffentlich. Zudem wurden die Slides, welche bei der Release Party gezeigt wurden auch veröffentlicht: Downloads finden sich auf der Twitter Bootstrap Seite auf GitHub. Wenn dir der Blogpost gefallen hat, dann hinterlasse doch einen Kommentar. Wenn du auf ...

  • image.png
    Javascript zu Dart Translator

    Dart, Google Javascript Alternative, wurde vor ein paar Monaten vorgestellt und die Webentwickler Szene ist noch etwas gespalten, ob Dart nun überflüssig ist oder einfach nur cool und längst überfällig ist. Um die Sprache näher zu erläutern hat Google die grundlegenden Javascript Basics nach Dart übersetzt. Das Ergebnis ist der “Translator”. Der Name mag momentan ...

  • Twitter Bootstrap 2.0–“Beta”

    Twitter Bootstrap, ein UI-Toolkit für Web-Applikationen von Twitter, erscheint (wie bereits berichtet) demnächst in der Version 2.0. Der offizielle Release ist am 31. Januar, allerdings beginnt jetzt laut Mark Otto (einer der Hauptentwickler von Twitter Bootstrap) die intensive Test-Phase. Das heisst, das es nun offiziel auch die 2.0 Dokumentation online gibt. Im Vergleich zur aktuellen ...

Support us!

Facebook