如果一个 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的更多相关文章

  1. perl6 HTTP::UserAgent (2)

    http://www.cnblogs.com/perl6/p/6911166.html 之前这里有个小小例子, 这里只要是总结一下. HTTP::UserAgent包含了以下模块: --------- ...

  2. perl6 HTTP::UserAgent发送post

    use HTTP::UserAgent; my $ua = HTTP::UserAgent.new; say 'All method:'; say $ua.^methods; my %data = : ...

  3. perl6检测网站CMS脚本(测试代码)

    代码如下: use HTTP::UserAgent; use JSON::Tiny; my $check-url = 'www.baidu.com'; #say @*ARGS[0]; #检测命令行参数 ...

  4. 实现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 ...

  5. types.go

    } type ChannelStatsList []*ChannelStats func (c ChannelStatsList) Len() int { return len(c) } func ( ...

  6. stats.go

    , len(c.clients))             for _, client := range c.clients {                 clients = append(cl ...

  7. client_v2.go

        }     return false }

  8. PJSUA2开发文档--第九章 PJSUA2应用程序示例

    9. PJSUA2示例应用程序 9.1 示例应用程序 9.1.1 C++ pjsip-apps/src/samples/pjsua2_demo.cpp 是一个非常简单可用的C++示例应用程序. /* ...

  9. PJSUA2开发文档--第三章 PJSUA2高级API

    3. PJSUA2高级API PJSUA2是PJSUA API以上的面向对象抽象.它为构建会话发起协议(SIP)多媒体用户代理应用程序(也称为IP / VoIP软电话)提供高级API.它将信令,媒体和 ...

随机推荐

  1. php 随机密码和盐 来自wordpress

    生成随机密码或盐. Generate keys and salts using secure CSPRNG $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJ ...

  2. HDU4788_Hard Disk Drive

    水题. 但是我写挫了一个地方,Wa了三发.好吧,不能忍了. 还有,本屌不知道如何用printf输出%,哪位学过C++的大仙知道这是什么情况?  告诉我一声啊. #include <iostrea ...

  3. robot framework Selenium2关键字介绍

    *** Settings *** Library Selenium2Library *** Keywords *** Checkbox应该不被选择 [Arguments] ${locator} Che ...

  4. [BZOJ2432][Noi2011]兔农 矩阵乘法+exgcd

    2432: [Noi2011]兔农 Time Limit: 10 Sec  Memory Limit: 256 MB Description 农夫栋栋近年收入不景气,正在他发愁如何能多赚点钱时,他听到 ...

  5. [洛谷P4341][BJWC2010]外星联络

    题目大意:给你一个长度为$n(n\leqslant3\times10^3)$的字符串,要你求出其中出现次数大于$1$的子串,并按字典序输出次数. 题解:建$SAM$后求出每个点的$size$,最后按字 ...

  6. Java 工作2年后需要达到怎么样的技术水平

    有人回答说这只能是大企业或者互联网企业的工程师才能拿到.也许是的,小公司或者非互联网企业拿两万的不太可能是码农了,应该是已经转管理后才有可能.还有区域问题,这个不在我的考虑范围内,因为除了北上广深杭, ...

  7. 被动式pocscan扫描神器搭建

    1.搭建环境: 操作系统为:ubuntu16.04 x64位系统,内核版本3.0.10以上 2.安装docker镜像 root@backlion-virtual-machine:/# apt-get ...

  8. 孙鑫视频VC++深入详解学习笔记

    孙鑫视频VC++深入详解学习笔记 VC++深入详解学习笔记 Lesson1: Windows程序运行原理及程序编写流程 Lesson2: 掌握C++基本语法 Lesson3: MFC框架程序剖析 Le ...

  9. selenium - webdriver - cookie操作

    WebDriver提供了操作Cookie的相关方法,可以读取.添加和删除cookie信息. WebDriver操作cookie的方法: get_cookies(): 获得所有cookie信息. get ...

  10. Chiaki Sequence Revisited HDU - 6304 lowbit找规律法

    Problem Description Chiaki is interested in an infinite sequence a1,a2,a3,..., which is defined as f ...