WWW :: Mechanize不喜欢POSTing json

时间:2014-10-01 05:17:24

标签: json perl www-mechanize

我有以下代码:

my $j = encode_json { "arguments" => { "peer-port" => "4444" }, "method" => "session-set", };
$mech->get('http://192.168.1.10:9091');
my $req = HTTP::Request->new( 'POST', 'http://192.168.1.10:9091/transmission/rpc' );
$req->header( 'Content-Type' => 'application/json' );
$req->content($j);
$mech->request($req);

运行时,我收到以下错误:

Error POSTing http://192.168.1.10:9091/transmission/rpc: Conflict at ./pia.pl line 48.

我无法找到关于此特定错误的任何内容,也无法在WWW :: Mechanize的文档(或HTTP :: Request' s)中找到任何可以解释它的内容。脚本在执行正确的表单提交时没有问题,它只在这个上失败(目标http服务器显然只接受ajax / json请求)。

2 个答案:

答案 0 :(得分:5)

“冲突”是来自服务器的响应,您应该检查响应的详细信息。 来自RFC2616:

  

10.4.10 409冲突

     

由于与资源的当前状态发生冲突,无法完成请求。此代码仅在预期用户可能能够解决冲突并重新提交请求的情况下才允许。响应主体应该包含足够的信息供用户识别冲突的来源。 ...

因此,请检查您获得的完整响应($mech->content),以找出冲突发生的原因。如果这无助于检查服务器端的日志或查阅服务器端API的文档。

在您的具体情况下,您可能需要在请求中添加X-Transmission-Session-Id标头,有关详细信息,请参阅https://forum.transmissionbt.com/viewtopic.php?f=8&t=8393

答案 1 :(得分:3)

您不需要明确创建HTTP::Request对象。

my $j = encode_json { "arguments" => { "peer-port" => "4444" }, "method" => "session-set", };
$mech->get('http://192.168.1.10:9091');
$mech->post("http://192.168.1.10:9091/transmission/rpc",
    'Content-Type' => 'application/json', Content => $j);