zoukankan      html  css  js  c++  java
  • 使用metawebblog api 实现自己的博客接口

    metawebblog api  是一个博客标准,这样我们就可以通过实现这个标准来实现

    我们自己的博客支持word2007,windows liver writer来写博客.

    metablog的.net接口如下.

    using System;
    using System.Collections.Generic;
    using System.Text;
    using CookComputing.XmlRpc;

    namespace blog
    {

        #region Structs

        public struct BlogInfo
        {
            public string blogid;
            public string url;
            public string blogName;
        }

        public struct Category
        {
            public string categoryId;
            public string categoryName;
        }

        [Serializable]
        public struct CategoryInfo
        {
            public string description;
            public string htmlUrl;
            public string rssUrl;
            public string title;
            public string categoryid;
        }

        [XmlRpcMissingMapping(MappingAction.Ignore)]
        public struct Enclosure
        {
            public int length;
            public string type;
            public string url;
        }

        [XmlRpcMissingMapping(MappingAction.Ignore)]
        public struct Post
        {
            [XmlRpcMissingMapping(MappingAction.Error)]
            [XmlRpcMember(Description = "Required when posting.")]
            public DateTime dateCreated;
            [XmlRpcMissingMapping(MappingAction.Error)]
            [XmlRpcMember(Description = "Required when posting.")]
            public string description;
            [XmlRpcMissingMapping(MappingAction.Error)]
            [XmlRpcMember(Description = "Required when posting.")]
            public string title;

            public string[] categories;
            public Enclosure enclosure;
            public string link;
            public string permalink;
            [XmlRpcMember(
                 Description = "Not required when posting. Depending on server may "
                 + "be either string or integer. "
                 + "Use Convert.ToInt32(postid) to treat as integer or "
                 + "Convert.ToString(postid) to treat as string")]
            public object postid;
            public Source source;
            public string userid;

            //public string mt_excerpt;
        }

        [XmlRpcMissingMapping(MappingAction.Ignore)]
        public struct Source
        {
            public string name;
            public string url;
        }

        public struct UserInfo
        {
            public string userid;
            public string firstname;
            public string lastname;
            public string nickname;
            public string email;
            public string url;
        }

        public struct MediaObjectUrl
            {
                public string url;
            }

        public struct MediaObject
            {
                public string name;
                public string type;
                public byte[] bits;
            }
        #endregion
        public interface IMetaWeblog
        {
            #region MetaWeblog API

            [XmlRpcMethod("metaWeblog.newPost",
                 Description = "Makes a new post to a designated blog using the "
                 + "MetaWeblog API. Returns postid as a string.")]
            string newPost(
                string blogid,
                string username,
                string password,
                Post post,
                bool publish);

            [XmlRpcMethod("metaWeblog.editPost", Description = "Updates and existing post to a designated blog "
                 + "using the MetaWeblog API. Returns true if completed.")]
            bool editPost(
                string postid,
                string username,
                string password,
                Post post,
                bool publish);

            [XmlRpcMethod("metaWeblog.getPost",
                 Description = "Retrieves an existing post using the MetaWeblog "
                 + "API. Returns the MetaWeblog struct.")]
            Post getPost(
                string postid,
                string username,
                string password);

            [XmlRpcMethod("metaWeblog.getCategories",
                 Description = "Retrieves a list of valid categories for a post "
                 + "using the MetaWeblog API. Returns the MetaWeblog categories "
                 + "struct collection.")]
            CategoryInfo[] getCategories(
                string blogid,
                string username,
                string password);

            [XmlRpcMethod("metaWeblog.getRecentPosts",
                 Description = "Retrieves a list of the most recent existing post "
                 + "using the MetaWeblog API. Returns the MetaWeblog struct collection.")]
            Post[] getRecentPosts(
                string blogid,
                string username,
                string password,
                int numberOfPosts);

            [XmlRpcMethod("metaWeblog.newMediaObject", Description = "Add a media object to a post using the metaWeblog API. Returns media url as a string.")]
            MediaObjectUrl newMediaObject(string blogid, string username, string password, MediaObject mediaObject);

            #endregion

            #region BloggerAPI

            [XmlRpcMethod("blogger.deletePost",
                 Description = "Deletes a post.")]
            [return: XmlRpcReturnValue(Description = "Always returns true.")]
            bool deletePost(
                string appKey,
                string postid,
                string username,
                string password,
                [XmlRpcParameter(
                     Description = "Where applicable, this specifies whether the blog "
                     + "should be republished after the post has been deleted.")]
            bool publish);

            [XmlRpcMethod("blogger.getUsersBlogs",
                 Description = "Returns information on all the blogs a given user "
                 + "is a member.")]
            BlogInfo[] getUsersBlogs(
                string appKey,
                string username,
                string password);

            [XmlRpcMethod("blogger.getUserInfo",
                 Description = "Returns information about the given user.")]
            UserInfo getUserInfo(
                string appKey,
                string username,
                string password);

            #endregion

        }

    }

     

    我们再实现这个接口:

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Collections;
    using System.Data;
    using System.IO;
    using individual;
    using CookComputing.XmlRpc;
    using article;
    using System.Web;

    namespace blog
    {
        public class MetaWeblog : XmlRpcService, IMetaWeblog
        {

            #region IMetaWeblog 成员

            public string newPost(string blogid, string username, string password, Post post, bool publish)
            {
                if (!ValidateUser(username, password)) throw new XmlRpcFaultException(0, "用户不存在");

                ArticleCategory cat = new ArticleCategory();
                DataSet ds= cat.GetAllDSByBlogId(int.Parse(blogid));

                DataTable dt = ds.Tables[0];
                DataRowCollection drs = ds.Tables[0].Rows;

                Article article = new Article();
                ArticleModel model = new ArticleModel();
                model.AddTime = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss");
                model.BlogId = int.Parse(blogid);
                model.Contents = post.description;
                model.CanRemark = 1;
                model.Subject = post.title;
                model.State = (publish) ? 1 : 2;

                if (post.categories.Length > 0)
                {
                    string catName = post.categories[0];
                    DataRow[] aryDr = dt.Select("name='" + catName +"'");
                    model.CategoryId = int.Parse(aryDr[0]["categoryId"].ToString());
                }
                else
                {
                    model.CategoryId = int.Parse(drs[0]["categoryId"].ToString());
                }

                article.Model = model;
                long postId = article.Add();

                if (postId > 0)
                    return postId.ToString();
                else
                    throw new XmlRpcFaultException(0, "发表文章不成功");

            }

            public bool editPost(string postid, string username, string password, Post post, bool publish)
            {
                if (!ValidateUser(username, password)) throw new XmlRpcFaultException(0, "用户不存在");
                try
                {
                    Article article = new Article();
                    int articleId = int.Parse(postid);
                    ArticleModel model = (ArticleModel)article.GetById(articleId);

                    model.AddTime = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss");
                    model.Contents = post.description;
                    model.Subject = post.title;
                    model.State = (publish) ? 1 : 2;
                    if (post.categories.Length > 0)
                    {
                        ArticleCategory cat = new ArticleCategory();
                        DataSet ds = cat.GetAllDSByBlogId(model.BlogId);
                        DataTable dt = ds.Tables[0];
                        string catName = post.categories[0];
                        DataRow[] aryDr = dt.Select("name='" + catName +"'");
                        model.CategoryId = int.Parse(aryDr[0]["categoryId"].ToString());
                    }
                    article.Model = model;
                    article.Update();
                    return true;
                }
                catch (Exception ex)
                {
                    throw new XmlRpcFaultException(0, "更新文章失败");
                }
            }

            public Post getPost(string postid, string username, string password)
            {
                if (!ValidateUser(username, password)) throw new XmlRpcFaultException(0, "用户不存在");
                Article article = new Article();
                int articleId = int.Parse(postid);
                ArticleModel model = (ArticleModel)article.GetById(articleId);

                Post post = ConvertModelToPost(model);
                return post;
            }

            public CategoryInfo[] getCategories(string blogid, string username, string password)
            {
                if (!ValidateUser(username, password)) throw new XmlRpcFaultException(0, "用户不存在");
                ArticleCategory cat = new ArticleCategory();
                int blogId=int.Parse(blogid);
                DataSet ds= cat.GetAllDSByBlogId(blogId);
                DataRowCollection drs = ds.Tables[0].Rows;
                ArrayList al = new ArrayList(drs.Count);
                foreach (DataRow dr in drs)
                {
                    CategoryInfo catInfo = new CategoryInfo();
                    catInfo.categoryid = dr["CategoryId"].ToString();
                    catInfo.title = dr["name"].ToString();
                    catInfo.description = "";
                    catInfo.htmlUrl = "";
                    catInfo.rssUrl = "";
                    al.Add(catInfo);
                }
                return al.ToArray(typeof(CategoryInfo)) as CategoryInfo[];
            }

            public Post[] getRecentPosts(string blogid, string username, string password, int numberOfPosts)
            {
                if (!ValidateUser(username, password)) throw new XmlRpcFaultException(0, "用户不存在");

                int blogId=int.Parse(blogid);

                Article article = new Article();
                DataSet ds= article.GetAllByBlogId(blogId, 1, numberOfPosts).PageDataSet;

                DataRowCollection drs=ds.Tables[0].Rows;

                ArrayList al = new ArrayList(drs.Count);

                foreach (DataRow dr in drs)
                {
                    Post post = new Post();
                    post.postid = dr["articleId"].ToString();
                    post.title = dr["subject"].ToString();
                    post.description = dr["Contents"].ToString();
                    post.categories = new string[] { dr["CategoryId"].ToString()};
                    al.Add(post);
                }

                return (Post[])al.ToArray(typeof(Post));
            }

    //实现文件上传

            public MediaObjectUrl newMediaObject(string blogid, string username, string password, MediaObject mediaObject)
            {
                if (!ValidateUser(username, password)) throw new XmlRpcFaultException(0, "用户不存在");

                Blog blog = new Blog();
                BlogModel model = (BlogModel)blog.GetById(int.Parse(blogid));

                string filename =  HttpContext.Current.Server.MapPath("/data/" + model.UserId + "/" + mediaObject.name);
                if (!Directory.Exists(Path.GetDirectoryName(filename)))
                    Directory.CreateDirectory(Path.GetDirectoryName(filename));
                File.WriteAllBytes(filename, mediaObject.bits);
                MediaObjectUrl mediaObjectUrl = new MediaObjectUrl();
                mediaObjectUrl.url = "http://博客地址/data/" + model.UserId + "/" + mediaObject.name;
                return mediaObjectUrl;
            }

            public bool deletePost(string appKey, string postid, string username, string password, bool publish)
            {
                if (!ValidateUser(username, password)) throw new XmlRpcFaultException(0, "用户不存在");
                Article article = new Article();
                article.Delete(int.Parse(postid));
                return true;
            }

            public BlogInfo[] getUsersBlogs(string appKey, string username, string password)
            {
                if (!ValidateUser(username, password)) throw new XmlRpcFaultException(0, "用户不存在");
                Blog blog = new Blog();

                BlogModel model =(BlogModel) blog.GetByNickname(username);
                BlogInfo bloginfo = new BlogInfo();
                bloginfo.blogid = model.BlogId.ToString();
                bloginfo.blogName = username;
                bloginfo.url = http://博客地址/ + username;
                return new BlogInfo[] { bloginfo };
            }

            public UserInfo getUserInfo(string appKey, string username, string password)
            {
                if(!ValidateUser(username,password)) throw new XmlRpcFaultException(0, "用户不存在");
                Individual indi = new Individual();
                IndividualModel model= indi.GetByNickName(username);
                UserInfo userInfo = new UserInfo();
                userInfo.nickname = model.Nickname;
                userInfo.email = model.Account;
                userInfo.userid = model.UserId.ToString();

                return userInfo;
            }

            private Post ConvertModelToPost(ArticleModel model)
            {
                Post post = new Post();
                post.postid = model.ArticleId.ToString();
                post.title = model.Subject;
                post.description = model.Contents;
                post.categories = new string[] { model.CategoryId.ToString() };
                return post;
            }

            private bool ValidateUser(string username, string password)
            {
                try
                {
                    bool isLogin = Individual.LoginNickname(username, password);
                    return isLogin;
                }
                catch (Exception ex)
                {
                    return false;
                }

            }
            #endregion
        }
    }

     

     

    这样就实现了博客支持客户端写作了

  • 相关阅读:
    ASP脚本获取服务器全部参数列表说明
    HTML基础教程
    HTML5代码大全
    CSS 属性大全
    Web前端单词大全
    css常用代码大全
    曾国藩:诚敬静谨恒!
    鼠标经过显示菜单
    月入3000+项目
    右侧菜单显示隐藏
  • 原文地址:https://www.cnblogs.com/yg_zhang/p/825290.html
Copyright © 2011-2022 走看看