2024/02/23(金)Ruby XMLRPCでdokuwikiのAPIをコールするとエラー
2024/02/23 18:52
DBを使わないので遅いが、その分設置場所の選択肢が多い。
PHPが使えるフリーサーバーがいくつかあるので、小さいチーム作業や情報公開用途であれば扱いやすいと思う。
さて、dokuwikiは標準でXML-RPCによるAPIを備えているのだが、Rubyからコールしようとしてハマった。
このサンプル通り、
xmlrpc:clients:devel:xmlrpc:clients [DokuWiki]
require 'xmlrpc/client' server = XMLRPC::Client.new("localhost", "/dokuwiki/lib/exe/xmlrpc.php", 8084) result = server.call("dokuwiki.getVersion") pp resultとしてコールしても、
XML-RPC server accepts XML requests only.が返ってきてしまう。
環境は、
・dokuwiki: Release 2024-02-06a "Kaos"
・PHP: 7.4
・Ruby: 2.7
HTTPサーバは問わない。
調査。
・RubyのXMLRPCはリクエストのContent-Typeに"text/xml;charset=UTF-8"がセットされる。
・dokuwikiのXML-RPC APIは"application/xml"か"text/xml"だけを受け付ける。これはcharsetがあるのもダメっぽい?
うーん、リクエストにcharsetはあっても良いはずなので、dokuwiki側のコードがかなり変か何かを読み飛ばしてるかもしれない。
とりあえず、RubyのXMLRPCはhttp_header_extraをセットすることでヘッダーを上書きできる。
コレを使って、以下にすれば動く。
require 'xmlrpc/client' server = XMLRPC::Client.new("localhost", "/dokuwiki/lib/exe/xmlrpc.php", 8084) server.http_header_extra = {"Content-Type" => "text/xml"} result = server.call("dokuwiki.getVersion") pp result