使用LWP :: UserAgent进行身份验证的Perl中的POST API

时间:2018-01-19 18:41:48

标签: perl http lwp

我正在尝试在perl中使用POST方法将信息发送到API。

我想打电话给下面的api,需要以下输入: URI:https://www.cryptopia.co.nz/api/SubmitTrade

输入参数为: -

市场:交易的市场象征,例如' DOT / BTC' (如果提供了TradePairId'则不需要)

TradePairId:交易的Cryptopia交易对象标识符,例如' 100' (如果提供市场'则不需要)

类型:交易类型,例如'买入'或者'销售'

费率:为硬币支付的费率或价格,例如0.00000034

金额:要购买的硬币数量,例如: 123.00000000

请告诉我如何从perl中调用这个api? 请求结构:

REQUEST_SIGNATURE:API_KEY +" POST" + URI + NONCE + HASHED_POST_PARAMS

API_KEY:您的Cryptopia api密钥

URI:请求uri。例如https://www.cryptopia.co.nz/Api/SubmitTrade

HASHED_POST_PARAMS:post参数的Base64编码MD5哈希

NONCE:每个请求的唯一指标。

所以问题是如何加入这个api https://www.cryptopia.co.nz/api/SubmitTrade并通过身份验证传递参数并检查返回的结果是否成功?

结果示例:

{
    "Success":true,
    "Error":null,
    "Data":
          {
             "OrderId": 23467,
             "FilledOrders": [44310,44311]
          }          
}

1 个答案:

答案 0 :(得分:0)

我没有Cryptopia帐户来测试这个,但这至少可以让你更接近工作原型。

设置

加载所需的模块并创建LWP::UserAgent对象。

use strict;
use warnings;
use LWP::UserAgent;
use JSON;
use Digest::MD5 qw(md5);
use Digest::SHA qw(hmac_sha256);
use MIME::Base64;
use URI::Encode qw(uri_encode);

my $api_key = 'PUBLIC KEY';
my $api_private_key = 'PRIVATE KEY';

my $ua = LWP::UserAgent->new;

生成请求

棘手的部分是生成授权标头。您帐户的API密钥将采用base64编码 - 因此在使用它来对请求进行签名时会调用decode_base64()

my $url = "https://www.cryptopia.co.nz/api/GetTradeHistory";

my %req = (
    Market => 'DOT/BTC',
);

my $nonce = int(rand(1000000));
my $post_data = encode_json(\%req);
my $post_data_enc = encode_base64(md5($post_data), "");
my $encoded_url = lc(uri_encode($url, encode_reserved => 1));
my $req_signature = sprintf("%sPOST%s%s%s", $api_key, $encoded_url, $nonce, $post_data_enc);
# Sign request signature with private key.
my $req_signature_hmac = encode_base64(hmac_sha256($req_signature, decode_base64($api_private_key)));
# Generate value for 'Authorization' header field.
my $auth_header_value = sprintf("amx %s:%s:%s", $api_key, $req_signature_hmac, $nonce);

备注......

  • 将空字符串作为第二个参数传递给encode_base64() - 以防止它将新行添加到输出中。
  • 来自uri_encode()模块的
  • URI::Encode用于编码网址。
  • 您可能希望为nonce使用替代源或随机生成器。

发送请求

您可以明确地创建一个HTTP::Request对象,并将其传递给LWP::UserAgent request()方法,但有一个post()便利方法可以完成所有这些操作对你而言。

此处的示例使用Content参数设置帖子正文的内容,并同时设置AuthorizationContent-Type标题。

my $response = $ua->post($url,
    Content => $post_data,
    'Content-Type' => 'application/json',
    Authorization => $auth_header_value
);

die "Request failed: ", $response->content unless $response->is_success();

print $response->content, $/;

检查响应

如上所述检查LWP Response对象可能就足够了 - 通过调用$response->is_success()方法。尽管如此,如果您想明确检查是否成功,只需使用$resp = decode_json($response->decoded_content)解码JSON响应即可。然后检查生成的哈希中的相关键。