2012-01-14 15 views
3

xmlrpcを使用してdrupal 7のノードを作成/更新/削除できる( "webservice")C#アプリケーションを作成する必要があります。私は私のアプリを実行するたびにxmlrpcファイル(ライブラリ)からエラーが発生します。私は、Drupalに接続するためにxmlrpcを使用してC#用のコード/ドキュメントを見つけようとしましたが、無駄でした。 あなたが正しい方向に私を指すことができる、または私といくつかの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に

はありがとう、 フローリン

+0

試したサンプルコードと実際に表示されるエラーメッセージを投稿してください。 http://tinyurl.com/so-hintsを確認してください –

答えて

3

あなたがDrupalの7を使用している場合は、(それが起こるとして、あるいはnode.savenode.getメソッドを持っていないサービス3を使用する必要があります。それらはそれぞれnode.retrievenode.create & node.updateに置き換えられました。

利用可能なすべての方法は、サービスモジュールフォルダのresources/node_resource.incファイルで表示できます。内部ノードは、フォームを送信するために使用される関数であるdrupal_executeを使用して送信され

UPDATE

。本体は、このフォーマット(PHP版)における多次元配列であることが期待だDrupalのフィールドであるので:

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

$languageは、(未定義の言語の特定のノードの言語、又はundであろういずれかあなたが多言語サイトundを扱っていない限り、通常は行く方法です)。 C#コードに似た配列を作成する必要があり、Drupalはそれを保存する必要があります。それがされています

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; 

別の更新

Java XML-RPC client example for Servicesはとても私の最高の推測では、あなたがDictionary(不必要に複雑に思える1はいえ)を使用することができますされ、これを行うためにHashMapタイプを使用しています私はC#でコード化してから何年かそこらのエラーを許しています。また、私はそれがより効率的に宣言できると確信していますが、私は正直なところ、ほとんどの言語を忘れてしまっています!

+0

ありがとう、それは働いて..しかし、私はノードの本文に問題がある、私はノード["ボディ"]にテキストを追加する現れる。理由を教えてもらえますか? – Sergiu

+0

@pretender:Drupalは、ノード上のフィールドがフォーマットされることを期待している方法と関係があります(ボディはDrupal 7のフィールドです)。私は答えを更新しました、それが助けてくれることを願っています。 – Clive

+0

私は配列を作ったのですが、無駄でした。あまりにも多くの質問をしなければ、いくつかのコードを共有できますか?私はあなたに1つ借りています。ありがとう! – Sergiu

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の怠慢に非難します。

関連する問題