【问题标题】:HTTP POST request for JSON in PerlPerl 中 JSON 的 HTTP POST 请求
【发布时间】:2014-03-27 01:02:11
【问题描述】:

我正在尝试在 Linksys EA4500 AP 中配置无线设置(例如将 ssid 设置为“vinoth”通道为“1”)。我可以使用 wireshark 看到下面的 POST 消息。

3E@@!dPzY+2K
SPOST /JNAP/ HTTP/1.1
Host: 192.168.1.1
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:22.0) Gecko/20100101 Firefox/22.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/json; charset=UTF-8
X-JNAP-Action: http:cisco.com/jnap/core/Transaction
X-JNAP-Authorization: Basic YWRtaW46YWRtaW4=
X-Requested-With: XMLHttpRequest
Referer: http:/cisco.com/     <<<<==== routerip
Content-Length: 474
Cookie: initial-tab=; ui-proxy-path=local; admin-auth=Basic%20YWRtaW46YWRtaW4%3D; current-applet=7B1F462B-1A78-4AF6-8FBB-0C221703BEA4
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache

[{"action":"http:/cisco.com/jnap/wirelessap/SetRadioSettings","request":{"radios":[{"radioID":"RADIO_2.4GHz","settings":{"isEnabled":true,"mode":"802.11bgn","ssid":"vinoth","broadcastSSID":true,"channelWidth":"Auto","channel":1,"security":"None"}}]}},{"action":"http://cisco.com/jnap/guestnetwork/SetGuestNetworkSettings","request":{"isGuestNetworkEnabled":false,"guestSSID":"vinoth-guest","guestPassword":"BeMyGuest","maxSimultaneousGuests":5,"broadcastGuestSSID":false}}]

我尝试使用 Perl 自动执行上述操作,但没有成功。由于我是这个 JSON 页面的新手,所以我不知道要发送的 POST 消息到底是如何发送的。

我为 $json 保留的内容是

'{"action":"http:/cisco.com/jnap/wirelessap/SetRadioSettings",' .
        '"request":{"radios":{"radioID":"RADIO_2.4GHz","settings":'.'{"isEnabled":true,"mode":"802.11bgn","ssid":"vinoth212","broadcastSSID":true,"channelWidth":"Auto","channel":1,"security":"None"}}}},{"action":"http://cisco.com/jnap/guestnetwork/SetGuestNetworkSettings",' .
    '"request":{"isGuestNetworkEnabled":false,"guestSSID":"vinoth-guest","guestPassword":"BeMyGuest","maxSimultaneousGuests":5,"broadcastGuestSSID":false}}';

和代码:

    use strict;
    use warnings;

    use LWP;

    my $ua = LWP::UserAgent->new;
    my $ip = $self->{ip};
    my $url = "http://$ip/";
    my $json = "";

    my $req = HTTP::Request->new(POST=>$url);
    $req->header('content-type' => 'application/json');
    $req->authorization_basic("admin", "admin");
    $req->content($json);

下面是检查请求状态的代码

    my $res = $ua->request($req);
    if ($res->is_success) {
    my $message = $res->decoded_content;
    print "received the message";
    } else {
    print "HTTP get code: ", $res->code, "\n";
    print "HTTP get: msg: ", $res->message, "\n";
    }

请帮我解决这个问题。期待您的宝贵回复。

P.S:在 Wireshark Post 消息中,链接不正确,因为我无法发布超过 2 个链接的查询。

谢谢, 维诺特

【问题讨论】:

  • 我试图在我的问题中发布我的代码,但它说很多缩进限制,所以我删除了它。
  • 可能是Referer标头?您的代码中没有它...
  • referer 标头应该是什么?我在该操作消息上看到两个链接。你能告诉我如何解析它吗??
  • Referer: http:/cisco.com/ &lt;&lt;&lt;&lt;==== routerip 与 Wireshark 日志中的相同
  • 我试过这个。我的 $req = HTTP::Request->new(POST=>"192.168.1.1/"); $req->header(content-type=>"application/json";$req->content($json); 我的 $ res = $ua->request($req); 并且 $res->is_success 的结果返回“Internal Server Error”和错误码“500”

标签: json perl httprequest lwp-useragent


【解决方案1】:

在发出任何请求时使用代码$req-&gt;authorization_basic("admin", "admin"); 表示Authorization: Basic YWRtaW46YWRtaW4= HTTP 标头。

但是从您的wireshirk 的标头来看,它是X-JNAP-Authorization: Basic YWRtaW46YWRtaW4=,这是不同的东西(自定义标头)。所以从你的块中删除 authorization_basic 并使用这些:

$req->header('Content-Type' => 'application/json; charset=UTF-8');
$req->header('X-JNAP-Action' => 'http:cisco.com/jnap/core/Transaction');
$req->header('X-JNAP-Authorization' => 'Basic YWRtaW46YWRtaW4=');
## YWRtaW46YWRtaW4= is base64 of admin:admin
$req->header('X-Requested-With' => 'XMLHttpRequest');

【讨论】:

  • 我尝试了上述方法,但仍然没有用。从 Wireshark 发布消息(尝试登录页面): POST /JNAP HTTP/1.1 TE: deflate,gzip;q=0.3 Connection: TE, close Host: 192.168.1.1 Referer: 192.168.1.1/ui/dynamic/login.html User-Agent: libwww-perl/6.03 Content -类型:应用程序/json; charset=UTF-8 X-JNAP-Action: cisco.com/jnap/core/CheckAdminPassword X-JNAP-Authorization: Basic YWRtaW46YWRtaW4= X-Requested-With: XMLHttpRequest
  • "HTTP/1.1 411 长度要求\n连接:关闭\n日期:2012 年 8 月 14 日星期二 22:52:13 GMT\n服务器:lighttpd/1.4.28\nContent-Length:357\nContent-类型:文本/html\n客户日期:格林威治标准时间 2014 年 3 月 27 日星期四 03:51:30\n客户对等方:192.168.1.1:80\n客户响应编号:1\n标题:411 - 需要长度\n\n \n/DTD XHTML 1.0 Transitional//EN\"\n\"w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\nw3.org/1999/xhtml\\n 411 - 需要长度\n \n \n

    411 - 需要长度

    \ n \n
猜你喜欢
  • 2014-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-04
相关资源
最近更新 更多