Вызов удаленной процедуры WordPress с помощью протокола XML-RPC
XML-RPC это протокол вызова удаленных процедур, который использует формат XML для кодирования данных и протокол HTTP для обмена данными по сети между клиентом и сервером.
В нашем примере в качестве клиента будет выступать Windows Forms приложение, а в качестве сервера, сайт под управлением cms WordPress. Данная cms имеет набор удаленных процедур для решения различных задач. Все доступные процедуры, описание, а так же принимаемые параметры и возвращаемые значения можно найти на официальном сайте, либо по запросу XML-RPC WordPress API.
Для примера рассмотрим вызов удаленной процедуры wp.getPost, которая позволяет получить в качестве результата структуру, которая содержит все поля таблицы wp_posts. Получив результат, выведем значение одной из колонок, например post_content, которая содержит текст статьи, в окно элемента управления textBox.
Создание XML файла
Так как передаваемые данные должны быть формата XML, то для начала создадим обычный xml файл, который будет хранить: имя удаленной процедуры и значения параметров.
<?xml version="1.0"?> <methodCall> <!-- имя вызываемой удаленной процедуры --> <methodName>wp.getPost</methodName> <!-- параметры --> <params> <!-- блог id --> <param> <value><int>0</int></value> </param> <!-- имя пользователя --> <param> <value><string>admin</string></value> </param> <!-- пароль --> <param> <value><string>123</string></value> </param> <!-- id поста --> <param> <value><int>16</int></value> </param> </params> </methodCall>
После строки объявления, следует корневой элемент methodCall, который содержит два элемента:
methodName – обязательный элемент, который хранит имя вызываемой удаленной процедуры.
params — необязательный элемент, который хранит значения передаваемых параметров. Должен быть создан, если процедура имеет параметры.
Как видно на картинке, удаленная процедура имеет несколько параметров, из них четыре является обязательными: int blog_id, string username, string password, int post_id, а остальные параметры Optional — необязательные.
Каждый параметр объявляется в xml файле, как элемент param, у которого обязательно нужно указать дочерний элемент value, который хранит значение параметра. Так же можно явно указать тип параметра, например: <int>, <string>,<boolean>, если тег с типом не указан, то по умолчанию значение параметра имеет тип string.
Выполнение XML-RPC запроса
XML файл создан, и теперь можно выполнить XML-RPC запрос, отправив на удаленный компьютер сообщение, которое состоит из двух блоков: header и body.
Header содержит различные http заголовки, среди которых обязательными являются: User-Agent, Host, Content-Length.
Body данные в формате XML.
Для обмена данными по сети используется протокол HTTP и метод передачи данных POST.
После отправки сообщения серверная сторона принимает запрос и выполняет указанную процедуру. После этого формируется новое сообщения (ответ), которое так же состоит из двух блоков, но содержит уже другие данные, так например блок body, теперь содержит root элемент methodResponse, который может содержать один из двух элементов: fault или params.
fault — данный элемент содержит сообщение об ошибке и представляет собой структуру, которая состоит из двух элементов: faultCode — код ошибки и faultString — строка описания ошибки.
params если ошибок нет, то в ответ мы получим возвращаемые значения (данные в формате XML), которые будут иметь такой вид:
<struct> <member> <name>post_content</name> <value><string>здесь текст статьи</string></value> </member> <member> <name>post_id</name> <value><int>id статьи</int></value> </member> </struct>
исходный код программы
//Добавить using System.Xml; using System.Net; using System.IO; namespace ExampleXmlRpc { public partial class Form1 : Form { //страница, принимающая запрос string URL = "имя сайта/xmlrpc.php"; string pathToXML = @"C:\.xml"; XmlDocument doc; public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { GetContent(); } private void GetContent() { doc = new XmlDocument(); try { doc.Load(pathToXML); byte [] byteArray = Encoding.UTF8.GetBytes(doc.InnerXml); //Создаём запрос WebRequest request = WebRequest.Create(URL); //Обязательные заголовки и метод передачи данных ((HttpWebRequest)request).UserAgent = "MyBrowser"; request.Method = "POST"; request.ContentType = "text/xml"; request.ContentLength = byteArray.Length; request.Credentials = CredentialCache.DefaultCredentials; //Отправка данных на сервер using (Stream dataStream = request.GetRequestStream()) { if (dataStream != null) dataStream.Write(byteArray, 0, byteArray.Length); } //ответ using (WebResponse webResponse = request.GetResponse()) { //проверяем код ответа if(((HttpWebResponse)webResponse).StatusCode == HttpStatusCode.OK) { using (Stream responseStream = webResponse.GetResponseStream()) { if (responseStream != null) { //очищаем старые данные загружаем новые doc.DocumentElement.ParentNode.RemoveAll(); //загружаем xml документ из потока ответа doc.Load(responseStream); //рут элемент XmlElement root = doc.DocumentElement; //ответ содержит ошибки? if(root.GetElementsByTagName("fault").Count > 0) { textBox1.Text = "Код ошибки: " + root.GetElementsByTagName("value").Item(1).InnerText + "\r\n\r\nТекст ошибки: " + root.GetElementsByTagName("value").Item(2).InnerText; } else //Выводим текст статьи textBox1.Text = root.GetElementsByTagName("value"). Item(13).InnerText; } } } else { textBox1.Text = "Код ответа: " + ((HttpWebResponse)webResponse).StatusCode.ToString(); } } } catch (Exception ex) { MessageBox.Show(ex.Message); } } } } }
Полученный ответ имеет XML формат. Используя метод Load, класса XmlDocument, загружаем XML-документ из указанного потока в память. Затем, чтобы получить текст статьи достаточно указать в качестве индекса число 13.
В адресе запроса, после имени сайта, обязательно указываем страницу xmlrpc.php, которая выступает обработчиком отправленного с клиента запроса.
В более ранних версиях WordPress (младше 3.5) перед отправкой запроса нужно было обязательно проверить включен ли XML-RPC протокол. Для этого нужно было перейти в меню Параметры, выбрать пункт Написание и проверить, чтобы стояла галочка рядом с пунктом «Включить протоколы публикации», как на картинке ниже.
Теперь этого делать не нужно, так как данный протокол по умолчанию будет включен сразу же после установки cms, а в админке этого пункта просто не будет.
Видео
И ещё одно видео дополнение, в котором рассмотрено два момента:
1. Возможность установки значений параметров напрямую из приложения. После чего не нужно будет каждый раз вручную изменять значения в самом xml файле.
2. Повышаем безопасность при передаче по сети значений параметров: логин и пароль, применяя кодирование base64. После кодирования эти данные не будут передаваться в открытом виде.
Читайте также: