используя c # для создания узла в drupal - PullRequest
3 голосов
/ 15 января 2012

Мне нужно создать приложение ("webservice") c #, которое может создавать / обновлять / удалять узлы для / из drupal 7, используя xmlrpc.каждый раз, когда я запускаю свое приложение, я получаю ошибки из файлов xmlrpc (библиотеки).Я пытался найти код / ​​документацию для C #, используя xmlrpc для подключения к drupal, но тщетно.Было бы неплохо, если бы вы указали мне правильное направление или поделились со мной кодом c #.

{
[XmlRpcUrl("http://testing/testserver")]
public interface IDrupalServices
{
    [XmlRpcMethod("node.get")]
    XmlRpcStruct NodeLoad(int nid, string[] field);
    [XmlRpcMethod("node.save")]
    void NodeSave(XmlRpcStruct node);
}

public partial class Form1 : Form
{

    public Form1()
    {
        InitializeComponent();

        IDrupalServices drupal = XmlRpcProxyGen.Create<IDrupalServices>();

        int nid = 227;
        string[] fields = new string[] { };

        XmlRpcStruct node = drupal.NodeLoad(nid, fields);

        string teaser = node["teaser"].ToString();
        welcomeTxt.Text = teaser;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        string title = txtTitle.Text;
        string body = txtBody.Text;

        IDrupalServices drupal = XmlRpcProxyGen.Create<IDrupalServices>();

        XmlRpcStruct node = new XmlRpcStruct();

        node["id"] = 1001;
        node["title"] = title;
        node["body"] = body;
        node["teaser"] = body;
        node["format"] = 1;
        node["type"] = "webservice";
        node["promote"] = false;

        drupal.NodeSave(node);
        MessageBox.Show("The post was been created!");

    }
}
}

После того, как я запустил это, я получил ошибку: Сервер возвратил исключение ошибки: [-32601]Ошибка сервера.Запрашиваемый метод node.get не указан.- в файле XmlRpcSerializer.cs

Спасибо, Флорин

Ответы [ 2 ]

3 голосов
/ 15 января 2012

Если вы используете Drupal 7, вы должны использовать Сервисы 3, у которых нет метода node.get (или node.save, как это происходит).Они были заменены на node.retrieve и node.create & node.update соответственно.

Вы можете просмотреть все доступные методы в файле resources/node_resource.inc в папке модуля «Службы».

ОБНОВЛЕНИЕ

Внутренне узел отправлениспользуя drupal_execute, которая является функцией, используемой для отправки формы.Поскольку тело - это поле в Drupal, ожидается, что это будет многомерный массив в этом формате (версия PHP):

$data["body"][$language][0]["value"]

$language будет либо конкретным языком для узла, либо und для неопределенного языка (если вы не имеете дело с многоязычным сайтом und, как правило, лучше).Вам нужно создать массив, подобный тому, что есть в вашем коде на C #, и Drupal должен его сохранить.

ДРУГОЕ ОБНОВЛЕНИЕ

Пример клиента XML-RPC для служб использует для этого тип HashMap, поэтому я думаю, что вымог бы использовать Dictionary (хотя тот, который кажется излишне сложным):

var innerValue = new Dictionary<string, string>();
innerValue.Add("value", txtBody.Text);

var language = new Dictionary<int, Dictionary<string, string>>();
language.Add(0, innerValue);

var body = new Dictionary<string, Dictionary<int, Dictionary<string, string>>>();
body.Add("und", language);

node["body"] = body;

Прошло несколько лет с тех пор, как я кодировал в C #, поэтому простите за любые ошибки там.Кроме того, я почти уверен, что это может быть объявлено более эффективно, но я забыл, что большая часть языка, если честно!

0 голосов
/ 17 августа 2015

Ян не совсем прав. Если вы используете библиотеку cook xmlrpc, все, что вам нужно сделать, это:

        XmlRpcStruct postStruct = new XmlRpcStruct();
        postStruct.Add("type", "article");
        postStruct.Add("title", "wohoo another test");

        XmlRpcStruct postBodyStructParams = new XmlRpcStruct();
        postBodyStructParams.Add("value", "My body yaaay");
        postBodyStructParams.Add("format", "filtered_html");

        XmlRpcStruct[] postBodyStructParamsArr = new XmlRpcStruct[1];
        postBodyStructParamsArr[0] = postBodyStructParams;

        XmlRpcStruct postBodyStruct = new XmlRpcStruct();
        postBodyStruct.Add("und", postBodyStructParamsArr);

        postStruct.Add("body", postBodyStruct);

К сожалению, параметры тела должны быть массивом структуры под ключом "und" только с одним значением. Я виню в этом неряшливость API drupal xmlrpc.

...