2016-03-07 00:12:26 +01:00
|
|
|
xmlrpcwsc-dotnet
|
|
|
|
================
|
|
|
|
|
|
|
|
Description
|
|
|
|
-----------
|
2016-03-14 00:28:10 +01:00
|
|
|
XmlRpc Web Service Client .NET is a C# implementation of XML-RPC, a popular
|
2016-03-07 00:12:26 +01:00
|
|
|
protocol that uses XML over HTTP to implement remote procedure calls.
|
2016-03-13 17:20:23 +01:00
|
|
|
This implementation can be used in .NET 4.5, NET 3.5 CF.
|
2016-03-14 00:28:10 +01:00
|
|
|
This software was tested with Odoo ERP 8 and 9.
|
2016-03-13 18:00:30 +01:00
|
|
|
Examples are available in the sandbox folder.
|
2016-03-07 00:12:26 +01:00
|
|
|
|
|
|
|
|
|
|
|
Features
|
|
|
|
--------
|
|
|
|
- Copyright: 2016 Saúl Piña <sauljabin@gmail.com>
|
|
|
|
- Repository: https://github.com/sauljabin/xmlrpcwsc-dotnet
|
|
|
|
- License: LGPL 3
|
|
|
|
- Language: C#, .NET 4.5
|
|
|
|
- IDE: Visual Studio 2012, MonoDevelop 5.9.6
|
2016-03-07 00:26:47 +01:00
|
|
|
- Version: v1.3.0
|
2016-03-07 00:12:26 +01:00
|
|
|
|
|
|
|
|
2016-03-13 17:20:23 +01:00
|
|
|
Links
|
|
|
|
-----
|
2016-03-07 00:12:26 +01:00
|
|
|
- http://xmlrpc.scripting.com/
|
|
|
|
- https://en.wikipedia.org/wiki/XML-RPC
|
2016-03-13 17:20:23 +01:00
|
|
|
|
|
|
|
|
|
|
|
Example Create Partner and Image
|
|
|
|
--------------------------------
|
|
|
|
- Source:
|
|
|
|
|
2016-03-13 18:00:30 +01:00
|
|
|
```cs
|
|
|
|
using System;
|
|
|
|
using XmlRpc;
|
|
|
|
using System.Xml;
|
|
|
|
using System.Collections.Generic;
|
|
|
|
using System.Text;
|
|
|
|
using System.IO;
|
|
|
|
|
|
|
|
namespace sandbox {
|
|
|
|
|
|
|
|
class MainClass {
|
|
|
|
|
|
|
|
public static string Url = "http://localhost:8069/xmlrpc/2", db = "odoo9", pass = "admin", user = "admin";
|
|
|
|
|
|
|
|
public static void TestCreateRecord() {
|
|
|
|
XmlRpcClient client = new XmlRpcClient();
|
|
|
|
client.Url = Url;
|
|
|
|
client.Path = "common";
|
|
|
|
|
|
|
|
// LOGIN
|
|
|
|
|
|
|
|
XmlRpcRequest requestLogin = new XmlRpcRequest("authenticate");
|
|
|
|
requestLogin.AddParams(db, user, pass, XmlRpcParameter.EmptyStruct());
|
|
|
|
|
|
|
|
XmlRpcResponse responseLogin = client.Execute(requestLogin);
|
|
|
|
|
|
|
|
Console.WriteLine("authenticate");
|
|
|
|
Console.WriteLine("REQUEST: ");
|
|
|
|
client.WriteRequest(Console.Out);
|
|
|
|
|
|
|
|
Console.WriteLine();
|
|
|
|
Console.WriteLine();
|
|
|
|
Console.WriteLine("RESPONSE: ");
|
|
|
|
client.WriteResponse(Console.Out);
|
|
|
|
|
|
|
|
Console.WriteLine();
|
|
|
|
Console.WriteLine();
|
|
|
|
Console.WriteLine("LOGIN: ");
|
|
|
|
if (responseLogin.IsFault()) {
|
|
|
|
Console.WriteLine(responseLogin.GetFaultString());
|
|
|
|
} else {
|
|
|
|
Console.WriteLine(responseLogin.GetString());
|
|
|
|
}
|
|
|
|
|
|
|
|
// CREATE
|
|
|
|
|
|
|
|
client.Path = "object";
|
|
|
|
|
|
|
|
XmlRpcRequest requestCreate = new XmlRpcRequest("execute_kw");
|
|
|
|
requestCreate.AddParams(db, responseLogin.GetInt(), pass, "res.partner", "create",
|
|
|
|
XmlRpcParameter.AsArray(
|
|
|
|
XmlRpcParameter.AsStruct(
|
|
|
|
XmlRpcParameter.AsMember("name", "Albert Einstein")
|
|
|
|
, XmlRpcParameter.AsMember("image", Convert.ToBase64String(File.ReadAllBytes("img/einstein.jpg")))
|
|
|
|
, XmlRpcParameter.AsMember("email", "albert.einstein@email.com")
|
|
|
|
)
|
|
|
|
)
|
|
|
|
);
|
|
|
|
|
|
|
|
XmlRpcResponse responseCreate = client.Execute(requestCreate);
|
|
|
|
|
|
|
|
Console.WriteLine();
|
|
|
|
Console.WriteLine();
|
|
|
|
Console.WriteLine("create");
|
|
|
|
Console.WriteLine("REQUEST: ");
|
|
|
|
client.WriteRequest(Console.Out);
|
|
|
|
|
|
|
|
Console.WriteLine();
|
|
|
|
Console.WriteLine();
|
|
|
|
Console.WriteLine("RESPONSE: ");
|
|
|
|
client.WriteResponse(Console.Out);
|
|
|
|
|
|
|
|
Console.WriteLine();
|
|
|
|
Console.WriteLine();
|
|
|
|
Console.WriteLine("READ: ");
|
|
|
|
if (responseCreate.IsFault()) {
|
|
|
|
Console.WriteLine(responseCreate.GetFaultString());
|
|
|
|
} else {
|
|
|
|
Console.WriteLine(responseCreate.GetString());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public static void Main(string[] args) {
|
|
|
|
TestCreateRecord();
|
|
|
|
Console.ReadKey();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2016-03-13 17:20:23 +01:00
|
|
|
```
|
|
|
|
|
|
|
|
- Output:
|
|
|
|
|
2016-03-13 18:00:30 +01:00
|
|
|
```xml
|
|
|
|
authenticate
|
|
|
|
REQUEST:
|
|
|
|
<?xml version="1.0" encoding="utf-8"?>
|
|
|
|
<methodCall>
|
|
|
|
<methodName>authenticate</methodName>
|
|
|
|
<params>
|
|
|
|
<param>
|
|
|
|
<value>
|
|
|
|
<string>odoo9</string>
|
|
|
|
</value>
|
|
|
|
</param>
|
|
|
|
<param>
|
|
|
|
<value>
|
|
|
|
<string>admin</string>
|
|
|
|
</value>
|
|
|
|
</param>
|
|
|
|
<param>
|
|
|
|
<value>
|
|
|
|
<string>admin</string>
|
|
|
|
</value>
|
|
|
|
</param>
|
|
|
|
<param>
|
|
|
|
<value>
|
|
|
|
<struct />
|
|
|
|
</value>
|
|
|
|
</param>
|
|
|
|
</params>
|
|
|
|
</methodCall>
|
2016-03-13 17:20:23 +01:00
|
|
|
|
2016-03-13 18:00:30 +01:00
|
|
|
RESPONSE:
|
|
|
|
<?xml version="1.0" encoding="utf-8"?>
|
|
|
|
<methodResponse>
|
|
|
|
<params>
|
|
|
|
<param>
|
|
|
|
<value>
|
|
|
|
<int>1</int>
|
|
|
|
</value>
|
|
|
|
</param>
|
|
|
|
</params>
|
|
|
|
</methodResponse>
|
|
|
|
|
|
|
|
LOGIN:
|
|
|
|
1
|
|
|
|
|
|
|
|
|
|
|
|
create
|
|
|
|
REQUEST:
|
|
|
|
<?xml version="1.0" encoding="utf-8"?>
|
|
|
|
<methodCall>
|
|
|
|
<methodName>execute_kw</methodName>
|
|
|
|
<params>
|
|
|
|
<param>
|
|
|
|
<value>
|
|
|
|
<string>odoo9</string>
|
|
|
|
</value>
|
|
|
|
</param>
|
|
|
|
<param>
|
|
|
|
<value>
|
|
|
|
<int>1</int>
|
|
|
|
</value>
|
|
|
|
</param>
|
|
|
|
<param>
|
|
|
|
<value>
|
|
|
|
<string>admin</string>
|
|
|
|
</value>
|
|
|
|
</param>
|
|
|
|
<param>
|
|
|
|
<value>
|
|
|
|
<string>res.partner</string>
|
|
|
|
</value>
|
|
|
|
</param>
|
|
|
|
<param>
|
|
|
|
<value>
|
|
|
|
<string>create</string>
|
|
|
|
</value>
|
|
|
|
</param>
|
|
|
|
<param>
|
|
|
|
<value>
|
|
|
|
<array>
|
|
|
|
<data>
|
|
|
|
<value>
|
|
|
|
<struct>
|
|
|
|
<member>
|
|
|
|
<name>name</name>
|
|
|
|
<value>
|
|
|
|
<string>Albert Einstein</string>
|
|
|
|
</value>
|
|
|
|
</member>
|
|
|
|
<member>
|
|
|
|
<name>image</name>
|
|
|
|
<value>
|
|
|
|
<string>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
|
|
|
|
</value>
|
|
|
|
</member>
|
|
|
|
<member>
|
|
|
|
<name>email</name>
|
|
|
|
<value>
|
|
|
|
<string>albert.einstein@email.com</string>
|
|
|
|
</value>
|
|
|
|
</member>
|
|
|
|
</struct>
|
|
|
|
</value>
|
|
|
|
</data>
|
|
|
|
</array>
|
|
|
|
</value>
|
|
|
|
</param>
|
|
|
|
</params>
|
|
|
|
</methodCall>
|
|
|
|
|
|
|
|
RESPONSE:
|
|
|
|
<?xml version="1.0" encoding="utf-8"?>
|
|
|
|
<methodResponse>
|
|
|
|
<params>
|
|
|
|
<param>
|
|
|
|
<value>
|
|
|
|
<int>43</int>
|
|
|
|
</value>
|
|
|
|
</param>
|
|
|
|
</params>
|
|
|
|
</methodResponse>
|
|
|
|
|
|
|
|
READ:
|
|
|
|
43
|
|
|
|
```
|
2016-03-13 17:20:23 +01:00
|
|
|
|
|
|
|
- Odoo Output:
|
|
|
|
|
|
|
|
![](/documents/printscreen-1.png)
|
|
|
|
|
|
|
|
![](/documents/printscreen-2.png)
|
|
|
|
|
|
|
|
- WinCE PrintScreen Example:
|
|
|
|
|
|
|
|
![](/documents/printscreen-3.png)
|