我正在尝试在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]
}
}
答案 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
用于编码网址。您可以明确地创建一个HTTP::Request
对象,并将其传递给LWP::UserAgent
request()
方法,但有一个post()
便利方法可以完成所有这些操作对你而言。
此处的示例使用Content
参数设置帖子正文的内容,并同时设置Authorization
和Content-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响应即可。然后检查生成的哈希中的相关键。