perl6 HTTP::UserAgent (3) JSON

如果一个 URL 要求POST数据是 JSON格式的, 那我们要怎么发送数据呢?

第一种:

HTTP::Request

上一篇说到, 发送 POST 数据, 可以:

1. $ua.post(url, %data)
2. $request.add-form-data(%data)
    $ua.request($request)

在这里, 无论是第一种方法还是第二种方法, 里面所发送的 %data 都会自动编码。

JSON也是一种字符串格式, 这两种方法要求%data为一个hash, 那就说明这两种方法不能实现发送JSON。

HTTP::Request 其实还有一种方法, 叫做:

add-content

些方法接受一个字符串的参数, 我们可以用这种方式提交JSON:

> my $request = HTTP::Request.new(POST=>‘http://localhost/‘)

添加 JSON 字符串:

> $request.content
(Any)
> %data = :user<root>, :password<root>
{password => root, user => root}
> $request.add-content(to-json(%data))
Nil
> $request.content
{ "password" : "root", "user" : "root" }
>

我这里用了 to-json (这方法在模块 JSON::Tiny中)把一个%data转化为一个 JSON字符串再传入$request中。

之后再请求就行了:

my $html = $ua.request($request)

我们可以打印出请求参数看一下是不是真的发送了JSON格式字符串:

> $html.request.Str
POST / HTTP/1.1
Host: localhost
Content-Length: 40
Connection: close

{ "password" : "root", "user" : "root" }

>

可以看到, 是发送了 JSON 格式的字符串数据。

基实我们只要发送一个 JSON的字符串就行了, 我上面的代码, 只是为了方便, 把一个 %data 转化成了字符串, 其实我们可以定义一个 JSON 格式的字符串, 再 add-content 添加, 最后发送即可, 如下:

先创建一个字符串:

> my $post_string = ‘{"password":"root", "user":"root"}‘

添加进request对象并请求:

> $request.add-content($post_string)
Nil
> $html = $ua.request($request)

最后打印请求参数是否正确:

> $html.request.Str
POST / HTTP/1.1
Host: localhost
Content-Length: 34
Connection: close

{"password":"root", "user":"root"}

>

可以看到, 一样是能正常发送的。

除了用 HTTP::Request 发送 JSON 请求外, PERL6还有一个模块:

WWW

这个模块可以接收字符串格式的POST数据, 也就是JSON了:

multi jpost($url where URI:D|Str:D, *%form);
multi jpost($url where URI:D|Str:D, %headers, *%form);
multi jpost($url where URI:D|Str:D, Str:D $form-body, *%headers);

say jpost ‘https://httpbin.org/post?meow=moo‘, :72foo, :bar<?>;
say jpost ‘https://httpbin.org/post?meow=moo‘,
        %(Content-type => ‘application/json‘), :72foo, :bar<?>;

用它发送请求, 可以像这样:

jpost ‘http://localhost‘, JSON, %headers;

这是 jpost 请求, 会自动获取 JSON 格式的 返回值, 如果要获取一般格式的响应请求, 可以用它的 POST 方法。

WWW 模块在如下地址可找到:

https://github.com/zoffixznet/perl6-WWW

我们可以看下它的 POST 源码, 其实也是用了 HTTP::Request进行了封装而已:

时间: 2024-10-13 01:41:51

perl6 HTTP::UserAgent (3) JSON的相关文章

perl6检测网站CMS脚本

代码如下: use HTTP::UserAgent; use JSON::Tiny; my $check-url = 'www.baidu.com'; #say @*ARGS[0]; #检测命令行参数 if @*ARGS != 0 { $check-url = @*ARGS[0].lc; }else{ say 'no http/https, eg:'; say 'cms-check.p6 www.target.com'; exit; } my $url = 'http://120.24.44.1

根据userAgent判断客户端是否手机、操作系统、浏览器等信息

User Agent中文名为用户代理,是Http协议中的一部分,属于头域的组成部分,User Agent也简称UA.它是一个特殊字符串头,是一种向访问网站提供你所使用的浏览器类型及版本.操作系统及版本.浏览器内核.等信息的标识.通过这个标识,用户所访问的网站可以显示不同的排版从而为用户提供更好的体验或者进行信息统计:例如用手机访问谷歌和电脑访问是不一样的,这些是谷歌根据访问者的UA来判断的.UA可以进行伪装.(wiki) 分析浏览器的User-Agent 我们可以收集客户端相关信息:是否手机.操

ZABBIX使用QQ报警(更新Mojo::web)

原文出自51cto.模块改变,在zabbix中文社区群(62239409)大家帮助下修改完成 安装依赖库 yum install mysql mysql-server mysql-devel mysql-libs mysql-connector-odbc openssl openssl-devel httpd mod_ssl mod_perl mod_auth_mysql gcc gcc-c++ autoconf glibc glibc-common gd gd-devel libjpeg li

stats.go

package nsqd import (     "sort"     "sync/atomic"     "github.com/nsqio/nsq/internal/quantile" ) type TopicStats struct {     TopicName string `json:"topic_name"`     Channels []ChannelStats `json:"channels&qu

实现QQ机器人报警

如题,废话不说,直接上代码.首先是登录QQ的小脚本 #!/usr/bin/perl use Webqq::Client; use Data::Dumper; use Digest::MD5 qw(md5_hex); use LWP::UserAgent; use JSON; my $qq = QQ号; my $pwd = md5_hex('QQ密码'); my $client = Webqq::Client->new(debug=>0);#等于1开启debug #############验证码

client_v2.go

package nsqd import (     "bufio"     "compress/flate"     "crypto/tls"     "fmt"     "net"     "sync"     "sync/atomic"     "time"     "github.com/mreiferson/go-snappyst

types.go

package clusterinfo import (     "encoding/json"     "fmt"     "sort"     "strings"     "time"     "github.com/blang/semver"     "github.com/nsqio/nsq/internal/quantile" ) type Producer

perl利用DNSPOD API获取域名的各个地区的解析

#!/usr/bin/perl use strict; use warnings; use LWP::UserAgent; use JSON; use Encode; my $mail='user'; my $pass='pass'; my $domain_info_url='https://dnsapi.cn/Domain.Info'; my $record_list_url='https://dnsapi.cn/Record.List'; sub get_domain_id { ###获取数

用Python教你如何爬取脉脉职言

脉脉是一个实名职场社交平台.之前爬了脉脉职言版块,大概爬了4027条评论,本文对爬取过程给出详细说明,对于评论内容仅做可视化分析,之前存了一堆这方面的文章,今天一看全都404了?. 爬虫 仍然使用python编程,对爬虫没兴趣的可以直接跳过看下部分,不影响悦读. 网址https://maimai.cn/gossip_list. 需要先登录才能看到里面的内容.爬取目标: ? 只爬文字部分,图片不考虑. 在浏览器内按F12打开开发者,向下滑,会看到很多gossip开头的json文件(不行的话刷新一下