使用c#在drupal中创建节点

时间:2012-01-14 21:34:28

标签: c# web-services drupal xml-rpc

我需要创建一个(“webservice”)c#app,它可以使用xmlrpc为drupal 7创建/更新/删除节点。每次我运行我的应用程序时,我都会从xmlrpc文件(库)中获取错误。我试图使用xmlrpc找到C#的代码/文档以连接到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 个答案:

答案 0 :(得分:3)

如果您使用的是Drupal 7,则必须使用没有node.get方法(或node.save方法)的服务3。它们已替换为node.retrievenode.create&amp;分别为node.update

您可以在“服务”模块文件夹中查看resources/node_resource.inc文件中的所有可用方法。

<强>更新

在内部,节点是使用drupal_execute提交的,$data["body"][$language][0]["value"] 是用于提交表单的函数。由于正文是Drupal中的一个字段,因此它应该是这种格式的多维数组(PHP版本):

$language

und或者是节点的特定语言,或und是未定义的语言(除非您正在处理多语言网站HashMap通常是通往走)。你需要构建一个类似于C#代码的数组,Drupal应该保存它。

另一个更新

Java XML-RPC client example for Services使用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; (尽管看似不必要的复杂):

{{1}}

我用C#编码已经有几年了,所以请原谅那里的任何错误。另外我很确定它可以被宣布更有效率但是我忘记了大部分语言都是诚实的!

答案 1 :(得分:0)

Jan的回答并不完全正确。如果您正在使用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);

不幸的是,body params需要是"und"键下的一个struct数组,只有一个值。我把这归咎于drupal xmlrpc API的邋。。