Mojo::UserAgent::Transactor

簡介

Mojo::UserAgent::Transactor 是Mojo::UserAgent中使用的事務(wù)構(gòu)建和操作框架宝泵。

use Mojo::UserAgent::Transactor;

# GET request with Accept header
my $t = Mojo::UserAgent::Transactor->new;
say $t->tx(GET => 'http://example.com' => {Accept => '*/*'})->req->to_string;

# POST request with form-data
say $t->tx(POST => 'example.com' => form => {a => 'b'})->req->to_string;

# PUT request with JSON data
say $t->tx(PUT => 'example.com' => json => {a => 'b'})->req->to_string;

內(nèi)容生成器

下面是兩種在Mojo::UserAgent::Transactor中實(shí)現(xiàn)的兩個(gè)內(nèi)容生成器轧飞,默認(rèn)情況下是可用的。

form

$t->tx(POST => 'http://example.com' => form => {a => 'b'});

生成HTTP請求中的查詢字符葵陵,編碼為application/x-www-form-urlencodedmultipart/form-data格式的內(nèi)容。

json

$t->tx(PATCH => 'http://example.com' => json => {a => 'b'});

使用Mojo::JSON對象生成用于在HTTP請求的request體中使用的JSON格式的內(nèi)容。

屬性

generators

my $generators = $t->generators;
$t             = $t->generators({foo => sub {...}});

設(shè)置或獲取“內(nèi)容生成器”援雇,默認(rèn)可用的內(nèi)容生成器僅有form和json吮铭。

name

my $name = $t->name;
$t       = $t->name('Mojolicious');

獲取或設(shè)置用戶代理生成request中請求頭User-Agent的值时迫。默認(rèn)值為Mojolicious (Perl)。

方法

Mojo::UserAgent::Transactor繼承了Mojo::Base中的所有方法谓晌,并實(shí)現(xiàn)了以下方法掠拳。

add_generator

$t = $t->add_generator(foo => sub {...});

注冊內(nèi)容生成器。

$t->add_generator(foo => sub {
  my ($t, $tx, @args) = @_;
  ...
});

endpoint

my ($proto, $host, $port) = $t->endpoint(Mojo::Transaction::HTTP->new);

獲取事務(wù)的實(shí)際端口纸肉。

peer

my ($proto, $host, $port) = $t->peer(Mojo::Transaction::HTTP->new);

獲取事務(wù)的實(shí)際 peer溺欧。

proxy_connect

my $tx = $t->proxy_connect(Mojo::Transaction::HTTP->new);

如果可能喊熟,構(gòu)建一個(gè)Mojo::Transaction::HTTP對象用于代理CONNECT請求。

redirect

my $tx = $t->redirect(Mojo::Transaction::HTTP->new);

如果可能姐刁,構(gòu)建一個(gè)Mojo::Transaction::HTTP對象用于對狀態(tài)碼301 芥牌,302,303聂使,307壁拉,308進(jìn)行請求重定向。

tx

my $tx = $t->tx(GET  => 'example.com');
my $tx = $t->tx(POST => 'http://example.com');
my $tx = $t->tx(GET  => 'http://example.com' => {Accept => '*/*'});
my $tx = $t->tx(PUT  => 'http://example.com' => 'Content!');
my $tx = $t->tx(PUT  => 'http://example.com' => form => {a => 'b'});
my $tx = $t->tx(PUT  => 'http://example.com' => json => {a => 'b'});
my $tx = $t->tx(POST => 'http://example.com' => {Accept => '*/*'} => 'Content!');
my $tx = $t->tx(PUT => 'http://example.com' => {Accept => '*/*'} => form => {a => 'b'});
my $tx = $t->tx(PUT => 'http://example.com' => {Accept => '*/*'} => json => {a => 'b'});

使用通用事務(wù)構(gòu)建器Mojo :: Transaction :: HTTP對象發(fā)起請求柏靶,支持“GENERATORS”弃理。

# Generate and inspect custom GET request with DNT header and content
say $t->tx(GET => 'example.com' => {DNT => 1} => 'Bye!')->req->to_string;

# Stream response content to STDOUT
my $tx = $t->tx(GET => 'http://example.com');
$tx->res->content->unsubscribe('read')->on(read => sub { say $_[1] });

# PUT request with content streamed from file
my $tx = $t->tx(PUT => 'http://example.com');
$tx->req->content->asset(Mojo::Asset::File->new(path => '/foo.txt'));

json內(nèi)容生成器使用Mojo:: JSON對象編輯數(shù)據(jù),并將內(nèi)容類型application/json屎蜓。

# POST request with "application/json" content
my $tx = $t->tx(POST => 'http://example.com' => json => {a => 'b', c => [1, 2, 3]});

form內(nèi)容生成器會(huì)自動(dòng)使用usr中的“查詢參數(shù)”為GET和HEAD請求中的數(shù)據(jù)進(jìn)行編碼案铺。

# GET request with query parameters
my $tx = $t->tx(GET => 'http://example.com' => form => {a => 'b'});

對于其他請求方法,使用application/x-www-form-urlencoded內(nèi)容類型梆靖。

# POST request with "application/x-www-form-urlencoded" content
my $tx = $t->tx(POST => 'http://example.com' => form => {a => 'b', c => 'd'});

可以使用charset選項(xiàng)對參數(shù)進(jìn)行編碼控汉。

# PUT request with Shift_JIS encoded form values
my $tx = $t->tx(PUT => 'example.com' => form => {a => 'b'} => charset => 'Shift_JIS');

數(shù)組引用可用于表示擁有多值的表單項(xiàng)。

# POST request with form values sharing the same name
my $tx = $t->tx(POST => 'http://example.com' => form => {a => ['b', 'c', 'd']});

具有content或file值的表單項(xiàng)可以使用“哈希引用”類型的Perl數(shù)據(jù)表示返吻;這時(shí)使用multipart/form-data格式的內(nèi)容對要“上傳的文件”和“內(nèi)容”進(jìn)行編碼姑子。

# POST request with "multipart/form-data" content
my $tx = $t->tx(POST => 'http://example.com' => form => {mytext => {content => 'lala'}});

# POST request with multiple files sharing the same name
my $tx = $t->tx(POST => 'http://example.com' =>
  form => {mytext => [{content => 'first'}, {content => 'second'}]});

在上傳文件時(shí),file值應(yīng)包含要上傳的文件的路徑或資源對象测僵,例如Mojo :: Asset :: File或Mojo :: Asset :: Memory街佑。

# POST request with upload streamed from file
my $tx = $t->tx(POST => 'http://example.com' => form => {mytext => {file => '/foo.txt'}});

# POST request with upload streamed from asset
my $asset = Mojo::Asset::Memory->new->add_chunk('lalala');
my $tx    = $t->tx(POST => 'http://example.com' => form => {mytext => {file => $asset}});

filename可以自動(dòng)生成也可以手動(dòng)設(shè)置。哈希引用中的其他值都會(huì)被合并到multipart/form-data頭部信息中捍靠。

# POST request with form values and customized upload (filename and header)
my $tx = $t->tx(POST => 'http://example.com' => form => {
  a      => 'b',
  c      => 'd',
  mytext => {
    content        => 'lalala',
    filename       => 'foo.txt',
    'Content-Type' => 'text/plain'
  }
});

multipart/form-data數(shù)據(jù)的類型也可以通過設(shè)置Content-Type頭來手動(dòng)指定沐旨。

# Force "multipart/form-data"
my $headers = {'Content-Type' => 'multipart/form-data'};
my $tx = $t->tx(POST => 'example.com' => $headers => form => {a => 'b'});

upgrade

my $tx = $t->upgrade(Mojo::Transaction::HTTP->new);

構(gòu)建一個(gè)Mojo::Transaction::WebSocket對象,并開始進(jìn)行WebSocket事務(wù)的握手請求榨婆。

websocket

my $tx = $t->websocket('ws://example.com');
my $tx = $t->websocket('ws://example.com' => {DNT => 1} => ['v1.proto']);

使用Mojo::Transaction::HTTP進(jìn)行WebSocket揚(yáng)請求的多功能事務(wù)構(gòu)建器磁携。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市良风,隨后出現(xiàn)的幾起案子谊迄,更是在濱河造成了極大的恐慌,老刑警劉巖烟央,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件统诺,死亡現(xiàn)場離奇詭異,居然都是意外死亡疑俭,警方通過查閱死者的電腦和手機(jī)粮呢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人啄寡,你說我怎么就攤上這事移怯。” “怎么了这难?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長葡秒。 經(jīng)常有香客問我姻乓,道長,這世上最難降的妖魔是什么眯牧? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任蹋岩,我火速辦了婚禮,結(jié)果婚禮上学少,老公的妹妹穿的比我還像新娘剪个。我一直安慰自己,他們只是感情好版确,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布扣囊。 她就那樣靜靜地躺著,像睡著了一般绒疗。 火紅的嫁衣襯著肌膚如雪侵歇。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天吓蘑,我揣著相機(jī)與錄音惕虑,去河邊找鬼。 笑死磨镶,一個(gè)胖子當(dāng)著我的面吹牛溃蔫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播琳猫,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼伟叛,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了脐嫂?” 一聲冷哼從身側(cè)響起痪伦,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎雹锣,沒想到半個(gè)月后网沾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蕊爵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年辉哥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,977評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡醋旦,死狀恐怖恒水,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情饲齐,我是刑警寧澤钉凌,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站捂人,受9級(jí)特大地震影響御雕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜滥搭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一艾猜、第九天 我趴在偏房一處隱蔽的房頂上張望帚桩。 院中可真熱鬧督笆,春花似錦育叁、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至冕象,卻和暖如春宪迟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背交惯。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工次泽, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人席爽。 一個(gè)月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓意荤,卻偏偏與公主長得像,于是被迫代替她去往敵國和親只锻。 傳聞我的和親對象是個(gè)殘疾皇子玖像,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 簡介 Mojo::UserAgent 是一個(gè)全功能的非阻塞 I/O HTTP 和 WebSocket 的用戶代理,...
    JSON_NULL閱讀 1,168評論 0 0
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)齐饮,斷路器捐寥,智...
    卡卡羅2017閱讀 134,657評論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,811評論 6 342
  • 簡介 Mojolicious::Controller是Mojolicious應(yīng)用程序中控制器的基類。如果你沒有在M...
    JSON_NULL閱讀 455評論 0 0
  • 簡介 Mojo :: Message是基于RFC 7230祖驱,RFC 7231和RFC 2388的 HTTP消息容器...
    JSON_NULL閱讀 435評論 0 0