在 python 中,调用 XML-RPC 方法涉及调用代理对象上的方法:
from xmlrpclib import ServerProxy
print ServerProxy('https://example.com/rpc').api.hello_there('John')
Run Code Online (Sandbox Code Playgroud)
在其他一些语言中,例如 perl,您可以将方法名称作为方法参数传递。
use Frontier::Client;
$p = Frontier::Client->new(url => 'https://example.com/rpc');
$result = $p->call('api.hello_there', 'John');
print $result;
Run Code Online (Sandbox Code Playgroud)
有没有办法在 Python 中按名称(作为字符串)调用 XML-RPC 方法?
我正在编写工作负载调度程序。我希望我的软件是一个点对点调度程序,即。一个节点只知道一些邻居(其他节点)并使用它们到达其他节点。
每个节点都有自己的加权路由表来向其他对等点发送消息(基本上基于跳数),即。“我希望主人给我我的时间表”或“节点 B 上的资源 A 是否可用?” :哪个邻居离我的目标最近?
例如,我使用XML-RPC( xmlrpc-c) 和std::multimaps/编写了自己的路由协议std::maps。
我正在考虑使用ZeroMQ来优化我的数据流:
作为结果 :
您认为这ZeroMQ是一个有用的概念吗?
我正在使用XML-RPC.NET 库在 C# 中开发 XML-RPC 服务。该服务将用于向 Tapatalk 用户公开论坛
Tapatalk API 文档说明应该实现哪些方法。有时参数被指定为可选。
例如get_topic有 4 个参数:forum_id, start_num,last_num和mode
该方法由 Tapatalk 应用程序使用所有参数或仅前 3 个参数调用(因此mode省略)。
我定义的方法如下:
[XmlRpcMethod("get_topic"]
public GetTopicResult GetTopic(string forum_id, int? start_num, int? last_num, string mode)
Run Code Online (Sandbox Code Playgroud)
当使用指定的所有 4 个参数调用该方法时,一切顺利。当mode省略时,我收到以下错误:Request contains too few param elements based on method signature.
将 mode 指定为可选参数似乎并不能解决问题:
[XmlRpcMethod("get_topic"]
public GetTopicResult GetTopic(string forum_id, int? start_num, int? last_num, string mode = "")
Run Code Online (Sandbox Code Playgroud)
尝试重载该方法会导致此错误: Method GetTopic in type …
使用 Python 2.6.x 的 xmlrpclib 在客户端和服务器之间交换的消息在服务器端创建了一种“实例”类型,而不是“日期时间”类型。在客户端,我创建了一个新的
updateTime = datetime(year, month, day, hour, minute, second)
print type(updateTime)
print updateTime
Run Code Online (Sandbox Code Playgroud)
结果是
<type 'datetime.datetime'>
2015-10-07 10:21:52
Run Code Online (Sandbox Code Playgroud)
发送时,字典在客户端看起来像这样:
'updateTime': datetime.datetime(2015, 10, 7, 10, 21, 52)
Run Code Online (Sandbox Code Playgroud)
但是服务器端的传入字典是这样的:
'updateTime': <DateTime '20151007T10:21:52' at 7f4dbf4ceb90>
Run Code Online (Sandbox Code Playgroud)
打印类型及其字符串表示如下:
<type 'instance'>
20151007T10:21:52
Run Code Online (Sandbox Code Playgroud)
我们正在使用 xmlrpclib.ServerProxy 但将use_datetime更改为True或False根本没有任何区别。
xmlrpclib.ServerProxy('https://'+rpc_server_addr, allow_none=True, use_datetime=True)
Run Code Online (Sandbox Code Playgroud)
为什么会这样?我也希望接收方有一个 tpye 'datetime.datetime'。
我xmlrpc.server用来构建服务器并pickle.dumps()用来腌制一些数据。然后我xmlrpc.client用来构建一个客户端并pickle.loads()用来解开这些数据。
## server
server = SimpleXMLRPCServer(('0.0.0.0', 5005), allow_none=True)
# in _dispatch method:
result = perform_stuff()
return pickle.dumps(result)
## client
proxy = ServerProxy(f'http://{host}:{port}', allow_none=True)
result = proxy.make_rpc()
return pickle.loads(result.data)
Run Code Online (Sandbox Code Playgroud)
但是,我解决了以下问题:
我不知道类似字节的对象和“二进制”之间的区别

我尝试使用 bytes(ret) 来解决这个问题,但它还有另一个

一些背景信息:在解决身份验证问题后,我在这里提出了这个问题。我更喜欢打开一个新的问题,以避免与原始问题无关的评论污染前一个问题,并给予它适当的可见性。
我正在开发一个与服务器在同一 Intranet 中运行的 SOAP 客户端,无需访问 Internet。
from requests.auth import HTTPBasicAuth
from zeep import Client
from zeep.transports import Transport
wsdl = 'http://mysite.dom/services/MyWebServices?WSDL'
client = Client(wsdl, transport=HTTPBasicAuth('user','pass'), cache=None)
Run Code Online (Sandbox Code Playgroud)
问题:WSDL 包含对位于 Intranet 外部的外部资源的导入('import namespace="schemas.xmlsoap.org/soap/encoding/"'),因此 Zeep 客户端实例化失败并显示:
Exception: HTTPConnectionPool(host='schemas.xmlsoap.org', port=80): Max retries exceeded with url: /soap/encoding/ (Caused by NewConnectionError('<requests.packages.urllib3.connection.HTTPConnection object at 0x7f3dab9d30b8>: Failed to establish a new connection: [Errno 110] Connection timed out',))
Run Code Online (Sandbox Code Playgroud)
问题:是否可以(并且有意义)在不访问外部资源的情况下创建 Zeep 客户端?
作为一个额外的细节,另一个用 Java 编写的基于 XML rpc ServiceFactory 的客户端似乎对此类问题更有弹性,即使没有可用的互联网连接,该服务也会创建(并工作)。真的需要从 xmlsoap.org 导入命名空间吗?
在 @mvt 回答后进行编辑:
因此,我选择了建议的解决方案,它允许我同时控制对外部资源的访问(阅读:禁止访问与托管端点的服务器不同的服务器)。
class MyTransport(zeep.Transport): …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 python 通过 Odoo 的 xml-rpc api 导入一些 Product.templates 和它们的 product.variants。
实际上我的代码正在创建 Product.templates 及其 attribute.line.ids 非常好,但不知何故 product.variants 没有创建,所以只有一个 product.variant 被创建而没有任何属性。我不知道如何正确地做到这一点。
所以首先我创建一个 product.template 如下(为了使它简短,只在此处插入名称):
id = models.execute_kw(db, uid, password, 'product.template', 'create', [{
'name': "New Partner",
}])
Run Code Online (Sandbox Code Playgroud)
之后我像这样添加attribute.line.ids:
for key in attValIdList.keys():
attribute_line = models.execute_kw(db, uid, password, 'product.attribute.line', 'create', [{
'product_tmpl_id': id,
'attribute_id': key,
'value_ids': [(6, 0, attValIdList[key])]
}])
Run Code Online (Sandbox Code Playgroud)
所以 attValidKeys 是一个包含字典的列表,我在其中存储了 attribute_id 和它们的 attribute_value_id。
所以这部分被正确填充。但是没有 product.variants 从 product.line.ids 中创建出来。
实际上添加具有属性的 product.product 也工作正常,但后来我遇到了问题,这个没有任何属性的随机 product.product 是自动创建的..
如果你们能帮我解决这个问题,那就太好了。
我正在尝试通过 XMLRPC 从 Odoo 获取一些数据,并且正在使用 PHP 及其 Ripcord 库(在https://www.odoo.com/documentation/8.0/api_integration.html上推荐)。
所以我按照该页面上写的步骤进行操作。
首先,我从https://github.com/poef/ripcord.git下载了 Ripcord 文件。我将它们保存在名为ripcord的文件夹中,该文件夹位于我的 PHP 页面的索引目录中。
其次,我启用了 PHP7 的 OpenSSL 和 XMLRPC 扩展。我认为我做得很好,因为如果我执行下一句话:
$modules = get_loaded_extensions();
foreach ($modules as $module) {
echo $module.', ';
}
Run Code Online (Sandbox Code Playgroud)
我得到这个结果:
核心、日期、libxml、openssl、pcre、zlib、过滤器、哈希、反射、SPL、会话、标准、apache2handler、mysqlnd、PDO、xml、日历、ctype、curl、dom、mbstring、fileinfo、ftp、gd、gettext、 iconv、json、exif、mcrypt、mysqli、pdo_mysql、Phar、posix、readline、shmop、SimpleXML、套接字、sysvmsg、sysvsem、sysvshm、分词器、wddx、xmlreader、xmlrpc、xmlwriter、xsl、Zend OPcache、
现在,这是我的index.php 的代码:
$url = 'http://localhost:30080';
$db = 'db_v80_test_01';
$username = 'admin';
$password = 'adminpwd';
require_once('ripcord/ripcord.php');
// $info = ripcord::client($url)->start();
// list($url, $db, $username, $password) = array($info['host'], $info['database'], $info['user'], $info['password']);
$common = ripcord::client($url.'/xmlrpc/2/common');
$uid …Run Code Online (Sandbox Code Playgroud) 我将此添加到.htaccessWordPress 网站:
<files xmlrpc.php>
order allow,deny
deny from all
</files>
Run Code Online (Sandbox Code Playgroud)
它有效,当有人尝试访问时http://example.com/xmlrpc.php,会显示此消息:
Forbidden
您无权访问此服务器上的 /xmlrpc.php。
但是,日志仍然显示 ( less /var/log/apache2/error.log):
[Thu May 02 10:02:03.316061 2019] [access_compat:error] [pid 19467]
[client 1.2.3.4:49409] AH01797: client denied by server
configuration: /path/to/xmlrpc.php
Run Code Online (Sandbox Code Playgroud)
如何拒绝访问 xmlrpc.php(可能来自 .htaccess)但防止它出现在 Apache 日志中?
我想使用 API 在我的 Wordpress 博客上发帖。因为我在一个 Javascript 应用程序中,所以我会使用这种语言来做到这一点。
我进行了一些搜索,发现使用 Wordpress XML-RPC 协议的node-wpapi包。一切正常,除了发布带有媒体或特色图片的文章。
const responseUploadImage = await wp.media()
.file('./tempImage.jpg')
.create({
title: 'My awesome image',
alt_text: 'an image of something awesome',
caption: 'This is the caption text',
description: 'More explanatory information'
});
const responsePostCreation = await wp.posts().create({
title: 'Your Post Title',
content: 'Your post content',
// status: 'publish'
});
const response = await wp.media().id(responseUploadImage.id).update({
post: responsePostCreation.id
});
Run Code Online (Sandbox Code Playgroud)
它确实创建帖子和上传媒体,但它不会创建带有媒体的帖子。
您知道使用 JS 库创建带有媒体和特色图像的帖子的替代方法或更好的方法吗?