Публикация постов в блог Wordpress при помощи API через XML RPC
Полезности | создано: 14.06.2017 | опубликовано: 14.06.2017 | обновлено: 13.01.2024 | просмотров: 9969
В статье речь пойдет не столько о публикации статей в wordpress блог, сколько о nuget-пакете, который предоставляет такую возможность.
Протокол XML RPC
Выдержка из описания с сайта Wikipedia:
XML-RPC (сокр. от англ. Extensible Markup Language Remote Procedure Call — XML-вызов удалённых процедур) — стандарт/протокол вызова удалённых процедур, использующий XML для кодирования своих сообщений и HTTP в качестве транспортного механизма. Является прародителем SOAP, отличается исключительной простотой в применении. XML-RPC, как и любой другой интерфейс Remote Procedure Call (RPC), определяет набор стандартных типов данных и команд, которые программист может использовать для доступа к функциональности другой программы, находящейся на другом компьютере в сети.
Протокол XML-RPC был изначально разработан Дэйвом Винером из компании «UserLand Software» в сотрудничестве с Майкрософт, в 1998 году. Однако корпорация Майкрософт вскоре сочла этот протокол слишком упрощённым, и начала расширять его функциональность. После нескольких циклов по расширению функциональности, появилась система, ныне известная как SOAP. Позднее Майкрософт начала широко рекламировать и внедрять SOAP, а изначальный XML-RPC был отвергнут. Но, несмотря на отвержение его Майкрософтом, стандарт XML-RPC очаровал многих программистов своей необычайной простотой и, за счёт этого, существует по сей день и даже постепенно набирает популярность.
Где используется
На данный момент существует множество полезных и очень полезных ресурсов, которые используют данный транспортный протокол в основе коммуникаций для своих API. В качестве примера могу привести SAPE.RU XML-RPC или XML-RPC WordPress API.
История про блог
Собственно говоря, история такова. Мой блог, который вы сейчас читаете, до недавнего времени был написан на ASP.NET MVC 5. В блоге работала система продажи ссылок Sape (ссылки не особо конечно продавались, но разговор не про них). После выхода в статус Release платформы ASP.NET Core у меня не получилось найти примеров кода для реализации этой же системы продажи ссылок на новой платформе. Пришлось немного углубиться в тему XML RPC и написать подобную систему собственноручно.
В общем, у меня получилось написать XML RPC Client nuget-пакет, который может отправлять запросы и обрабатывать ответы по протоколу XML RPC без привязки к конкретному сервису. А также, в дополнение к этому пакету, я сделал другой nuget-пакет Calabonga.Sape.Loader, который может работать уже непосредственно с Sape XML API, но речь в статье про первый, поэтому перейдем к примерам кода.
Блог на Wordpress
У меня есть блог на сайте wordpress. Редко, но всё-таки бывает такое, что я публикую туда посты, которые не связаны с программированием, хотя и про .NET бывают там публикации. И как раз на примере моего блога я хочу продемонстрировать работу моего nuget-пакета. У Wordpress есть отлично документированный Wordpress API XML RPC. Вперед!
Демонстрация работы XML RPC Client
Я создал небольшое консольное приложение, в которое установил упомянутый выше nuget-пакет.
Сервис предоставляет обширные возможности по управлению сущностями через API. Вот только основные методы:

Я создал небольшой класс, в котором прописал названия только некоторых из перечисленных методов:
public class WordpressClient {
public const string ApiUrl = "https://calabonga.wordpress.com/xmlrpc.php";
public const string Login = "WordPressAccount";
public const string Password = "xxxxxxxxxxxxxxx";
public const int UserId = 000000;
public const int BlogId = 0;
public class Requests {
public const string Hello = "demo.sayHello";
public const string GetUser = "wp.getUser";
public const string GetUsers = "wp.getUsers";
public const string GetProfile = "wp.getProfile";
public const string GetAuthors = "wp.getAuthors";
public const string GetPosts = "wp.getPosts";
public const string GetPost = "wp.getPost";
public const string GetNewPost = "wp.newPost";
public const string GetPostType = "wp.getPostType";
public const string GetPostStatusList = "wp.getPostStatusList";
public const string GetPostTypes = "wp.getPostTypes";
public const string GetMediaLibrary = "wp.getMediaLibrary";
public const string GetMediaItem = "wp.getMediaItem";
public const string UploadFile = "wp.uploadFile";
}
}
Примеры XML RPC запросов
Вот основной код моего консольного приложения:
class Program {
private static readonly XmlRpcClient Client =
new XmlRpcClient { Url = WordpressClient.ApiUrl };
static void Main(string[] args) {
GetHelloMessage();
GetPostStatusList();
GetPostTypeList();
GetPosts();
GetPost(666);
GetMediaLibrary();
GetMediaItem(185);
}
// сами методы удалены для краткости
}
demo.sayHello
А теперь по порядку описание методов. Первый метод GetHelloMessage():
private static void GetHelloMessage() {
var request = new XmlRpcRequest(WordpressClient.Methods.Hello);
var result = Client.Execute(request);
if (result.XmlRpcResponse.IsFault()) {
Console.WriteLine(result.XmlRpcResponse.GetFaultString());
}
Console.WriteLine(result.XmlRpcResponse.GetString());
}
Результат выполнения данного метода такой:

wp.getPostStatusList
Получение списка статусов для постов:
private static void GetPostStatusList() {
var request = new XmlRpcRequest(WordpressClient.Methods.GetPostStatusList);
request.AddParams(WordpressClient.BlogId, WordpressClient.Login, WordpressClient.Password);
var result = Client.Execute(request);
if (result.XmlRpcResponse.IsFault()) {
Console.WriteLine(result.XmlRpcResponse.GetFaultString());
}
Console.WriteLine(result.XmlRpcResponse.GetString());
}
Результат:

wp.getPostTypes
Получение списка доступных типов для поста:
private static void GetPostTypeList() {
var request = new XmlRpcRequest(WordpressClient.Methods.GetPostTypes);
request.AddParams(WordpressClient.BlogId, WordpressClient.Login, WordpressClient.Password);
var result = Client.Execute(request);
if (result.XmlRpcResponse.IsFault()) {
Console.WriteLine(result.XmlRpcResponse.GetFaultString());
}
Console.WriteLine(result.XmlRpcResponse.GetString());
}
Результат запроса вернул много букв, поэтому сокращу ответ:
wp.getPosts
Этот метод GetPosts() возвращает постранично все ваши посты с Wordpress.
private static void GetPosts() {
var request = new XmlRpcRequest(WordpressClient.Methods.GetPosts);
request.AddParams(WordpressClient.BlogId, WordpressClient.Login, WordpressClient.Password);
var result = Client.Execute(request);
if (result.XmlRpcResponse.IsFault()) {
Console.WriteLine(result.XmlRpcResponse.GetFaultString());
}
var posts = result.XmlRpcResponse.GetObject();
Console.WriteLine(JsonConvert.SerializeObject(posts));
}
Результат запроса тоже покажу в JSON-формате. В листинге в строке 8, я как раз его и сериащизую:
wp.getPost
Данный метод GetPost() получает пост по идентификатору. Так как я в прошлом запросе получил список, то получить любой из них по идентификатору не составит труда:
private static void GetPost(int postId) {
var request = new XmlRpcRequest(WordpressClient.Methods.GetPost);
request.AddParams(WordpressClient.BlogId, WordpressClient.Login, WordpressClient.Password, postId);
var result = Client.Execute(request);
if (result.XmlRpcResponse.IsFault()) {
Console.WriteLine(result.XmlRpcResponse.GetFaultString());
}
var post = result.XmlRpcResponse.GetObject();
Console.WriteLine(JsonConvert.SerializeObject(post));
}
Я также полученный результат сериализую в JSON:
wp.getMediaLibrary
Метод возвращает коллекцию медиа файлов, которые хранятся в вашем блоге. В моем случае, это набор картинок:
private static void GetMediaLibrary() {
var request = new XmlRpcRequest(WordpressClient.Methods.GetMediaLibrary);
request.AddParams(WordpressClient.BlogId, WordpressClient.Login, WordpressClient.Password);
var result = Client.Execute(request);
if (result.XmlRpcResponse.IsFault()) {
Console.WriteLine(result.XmlRpcResponse.GetFaultString());
}
var library = result.XmlRpcResponse.GetObject();
Console.WriteLine(JsonConvert.SerializeObject(library));
}
Полученный ответ также сериализую в JSON, но теперь покажу как результат в консоле.
В общем, очень много букв приходит в результате этого запроса. Ну, и раз существует метод получения коллекции, то значит должен быть метод возвращающий одну сущность из этой коллекции.
wp.getMediaItem
Метод возвращает одну сущность из этой медиа-коллекции:
private static void GetMediaItem(int attachmentId) {
var request = new XmlRpcRequest(WordpressClient.Methods.GetMediaItem);
request.AddParams(WordpressClient.BlogId, WordpressClient.Login, WordpressClient.Password, attachmentId);
var result = Client.Execute(request);
if (result.XmlRpcResponse.IsFault()) {
Console.WriteLine(result.XmlRpcResponse.GetFaultString());
}
var library = result.XmlRpcResponse.GetString();
Console.WriteLine(library);
}
Результат также покажу в окне консольного приложения:
Можете поверить, всё работает исключительно быстро и правильно.
Заключение
Я привел несколько примеров использования nuget-пакета XML RPC Client. А вы, в свою очередь, можете с легкостью реализовать другие нужные вам методы, посмотрев параметры метода в документации. В примерах я не делал десериализацию в объекты пришедшего от сервера ответа, но сделать это можно, например, при помощи Newtonsoft.JSON библиотеки. Думаю, понятно, что для добавления новой статьи в блог на Wordpress надо реализовать подобным способом метод wp.newPost.
Другими словами, nuget-пакет получился универсальным, вы можете его использовать для работы с любыми XML RPC сервисами.





