2012-01-14 117 views
3

我需要製作一個(「webservice」)c#應用程序,它可以使用xmlrpc爲/從drupal 7創建/更新/刪除節點。每當我運行我的應用程序時,我都會從xmlrpc文件(庫)中獲取錯誤。我試圖找到C#的代碼/文檔,使用xmlrpc連接到Drupal,但徒勞無功。 如果你能指向正確的方向,或者與我分享一些c#代碼,我會很好。使用c#在drupal中創建節點

{ 
[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

謝謝 林

+0

請發佈您嘗試過的示例代碼,以及您獲得的實際錯誤消息。檢查出http://tinyurl.com/so-hints – 2012-01-14 21:35:47

回答

3

如果您正在使用Drupal 7的您必須使用服務3不具有node.get方法(或node.save因爲它發生)。它們分別被替換爲node.retrievenode.create & node.update

您可以在服務模塊文件夾中的resources/node_resource.inc文件中查看所有可用的方法。

UPDATE

在內部的節點使用drupal_execute其是用於提交表單的功能提出的。由於主體是在Drupal它預期在這種格式(PHP版本)的多維陣列的字段:

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

$language要麼是用於節點未定義語言的特定語言,或und(除非你正在處理一個多語種網站und通常是要走的路)。你需要構建一個類似於你的C#代碼的數組,Drupal應該保存它。

另一個更新

Java XML-RPC client example for Services使用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

謝謝,這工作..但仍然我有節點的身體問題,如果我添加文本到節點[「身體」]它不會出現。你能告訴我爲什麼嗎? – Sergiu 2012-01-15 10:37:41

+0

@pretender:這是關於Drupal期望節點上的字段被格式化的方式(該體是Drupal 7中的字段)。我已經更新了答案,希望它有幫助 – Clive 2012-01-15 13:40:54

+0

我做了一個數組[,]但徒勞無功。你可以分享一些代碼,如果沒有太多要問。我會欠你一個。謝謝! – Sergiu 2012-01-15 19:12:43

0

Jan的答案並不完全正確。如果您使用的是廚師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); 

不幸的是,身體PARAMS必須是結構數組的"und"項下只有一個值。我把這個歸咎於drupal xmlrpc API的不合理性。

相關問題