perl6 HTTP::UserAgent (3) JSON
如果一个 URL 要求POST数据是 JSON格式的, 那我们要怎么发送数据呢?
第一种:
HTTP::Request
上一篇说到, 发送 POST 数据, 可以:
. $ua.post(url, %data)
. $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:
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:
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进行了封装而已:
perl6 HTTP::UserAgent (3) JSON的更多相关文章
- perl6 HTTP::UserAgent (2)
http://www.cnblogs.com/perl6/p/6911166.html 之前这里有个小小例子, 这里只要是总结一下. HTTP::UserAgent包含了以下模块: --------- ...
- perl6 HTTP::UserAgent发送post
use HTTP::UserAgent; my $ua = HTTP::UserAgent.new; say 'All method:'; say $ua.^methods; my %data = : ...
- perl6检测网站CMS脚本(测试代码)
代码如下: use HTTP::UserAgent; use JSON::Tiny; my $check-url = 'www.baidu.com'; #say @*ARGS[0]; #检测命令行参数 ...
- 实现QQ机器人报警
如题,废话不说,直接上代码.首先是登录QQ的小脚本 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 ...
- types.go
} type ChannelStatsList []*ChannelStats func (c ChannelStatsList) Len() int { return len(c) } func ( ...
- stats.go
, len(c.clients)) for _, client := range c.clients { clients = append(cl ...
- client_v2.go
} return false }
- PJSUA2开发文档--第九章 PJSUA2应用程序示例
9. PJSUA2示例应用程序 9.1 示例应用程序 9.1.1 C++ pjsip-apps/src/samples/pjsua2_demo.cpp 是一个非常简单可用的C++示例应用程序. /* ...
- PJSUA2开发文档--第三章 PJSUA2高级API
3. PJSUA2高级API PJSUA2是PJSUA API以上的面向对象抽象.它为构建会话发起协议(SIP)多媒体用户代理应用程序(也称为IP / VoIP软电话)提供高级API.它将信令,媒体和 ...
随机推荐
- PHP对象的遍历
对象的遍历 对象的遍历,跟数组的遍历,一样! 其实,只能遍历出对象的“实例属性数据” foreach( $对象名 as $key => $value){ //这里就可以处理$key和$va ...
- Java知识点整理(三)
如何设计出高可用的分布式架构 分布式架构 CDN简介 分布式缓存和本地缓存区别 高并发场景常用技术解决方案 JVM优化示例 Docker和JVM区别 Java开发人员需要注意的五大Docker误区 D ...
- HttpWebRequest 保存Cookies,模拟Session登录
前面使用HttpWebRequest 对象可以抓取网页中一些资料,不过有些页面可以直接打开,而有些页面必登录之后才能打开,也就是在登录后保存登录信息在Session,这样就可以访问有权限的页面了.下面 ...
- 《Linux Shell 脚本攻略》读书笔记
本书主要讲解一些linux shell命令的用法,讲解一些shell的奇技淫巧. 第一章 小试牛刀 主要介绍一些基本shell指令 终端打印:echo.printf 别名:alias 终端处理工具:t ...
- C++解析(2):进化后的 const 分析
0.目录 1.C语言中的const 2.C++中的const 3.对比 3.1 C语言与C++中的const 3.2 C++中的const与宏定义 4.小结 1.C语言中的const const修饰的 ...
- 【题解】CF#611 H-New Year and Forgotten Tree
有趣啊~手玩一下这棵树,发现因为连边只对相连点的位数有限制,我们可以认为是在往一棵已经有 m 个结点的树上挂叶子结点直到满足要求.(m = log(10) n).注意由于 m 超级无敌小,我们可以直接 ...
- [洛谷P5147]随机数生成器
题目大意:$$f_n=\begin{cases}\frac{\sum\limits_{i=1}^nf_i}n+1&(n>1)\\0&(n=1)\end{cases}$$求$f_n ...
- BZOJ 3786: 星系探索 解题报告
3786: 星系探索 Description 物理学家小C的研究正遇到某个瓶颈. 他正在研究的是一个星系,这个星系中有n个星球,其中有一个主星球(方便起见我们默认其为1号星球),其余的所有星球均有且仅 ...
- 「CodePlus 2017 12 月赛」可做题2(矩阵快速幂+exgcd+二分)
昨天这题死活调不出来结果是一个地方没取模,凉凉. 首先有个一眼就能看出来的规律... 斐波那契数列满足$a_1, a_2, a_1+a_2, a_1+2a_2, 2a_1+3a_2, 3a_1+5a_ ...
- LibreOJ #539. 「LibreOJ NOIP Round #1」旅游路线(倍增+二分)
哎一开始看错题了啊T T...最近状态一直不对...最近很多傻逼题都不会写了T T 考虑距离较大肯定不能塞进状态...钱数<=n^2能够承受, 油量再塞就不行了...显然可以预处理出点i到j走c ...