delphi调用阿里云的函数计算服务FC

阿里云函数计算:https://www.aliyun.com/product/fc?spm=5176.7933691.765261.210.ijPFRC

delphi版本:Embarcadero® Delphi 10.2 Version 25.0.26309.314 

阿里云最开始有PaaS层的“云引擎ACE”,像百度的“应用引擎BAE”一样,但是在2016时,阿里把它关闭了。

目前,阿里的“函数计算FC”有点类似这个,但感觉比之前ACE限制太多,要访问数据啥的第三方模组,需要使用docker等。

FC的调用SDK没有Delphi的版本,参照javascript的版本,修改了一个,可以运作:

unit wxhAliYun_FC;

interface
uses
  REST.Client,system.JSON,system.SysUtils;

  function invokeAliFC(req:TRESTRequest;funName:string;body:string):TJSONValue;

implementation

uses
  REST.Types,DateUtils,EncdDecd,cHash,System.Classes;

function DateTimeToGMT(const ADate:TDateTime):string;
const
  WEEK:array[1..7] of PChar = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat');
  MonthDig:array[1..12] of PChar =
    ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');
var
  wWeek,wYear,wMonth,wDay,wHour,wMin,wSec,wMilliSec:Word;
  sWeek,sMonth:string;
begin
  DecodeDateTime(ADate,wYear,wMonth,wDay,wHour,wMin,wSec,wMilliSec);
  wWeek := DayOfWeek(ADate);
  sWeek  := WEEK[wWeek];
  sMonth := MonthDig[wMonth];
  Result := Format('%s, %.2d %s %d %.2d:%.2d:%.2d GMT',[sWeek,wDay,sMonth,wYear,wHour,wMin,wSec]);
end;

//加密算法来自http://fundementals.sourceforge.net
function signString(source, secret:AnsiString):string;
var d:T256BitDigest;
begin
  d:=CalcHMAC_SHA256(secret,source);
  Result:=EncodeBase64(@d.Bytes,length(d.Bytes));
end;

function composeStringToSign(method, contentMD5,contentType,date,signHeaders,path:string):string;
begin
  Result:= method+#10+contentMD5+#10+contentType+#10+date+#10+signHeaders+#10+path;
end;

function invokeAliFC(req:TRESTRequest;funName:string;body:string):TJSONValue;
var
  vItem:TRESTRequestParameter;
  stringToSign,signature,sDate:string;
  accountID,path,host,sContentType,contentMD5:string;
  contentType:TRESTContentType;
  d:T128BitDigest;
  s:ansistring;
  b0,b:TBytes;
begin
  accountID:='你的账号ID';
  path:='/2016-08-15/services/flowers/functions/'+funName+'/invocations';
  host:=accountID+'.fc.cn-shanghai.aliyuncs.com';
  contentType:=TRESTContentType.ctAPPLICATION_OCTET_STREAM;
  sContentType:='application/octet-stream';//'application/json';
  //sDate:='Sat, 02 Sep 2017 03:08:12 GMT';
  sDate:=DateTimeToGMT(TTimeZone.Local.ToUniversalTime(now()));

  req.ClearBody();
  req.Params.Clear();

  req.Client.BaseURL:='http://localhost:8080'+path;
  //req.Client.BaseURL:='http://'+host+path;

  d:=CalcMD5(body);
  SetLength(s, Length(d.Bytes)*2);
  {$IFDEF NEXTGEN}
  SetLength(b,Length(d.Bytes)*2);
  b0:=BytesOf(@d.Bytes,length(d.Bytes));
  BinToHex(b0,0, b, 0,Length(b));
  s:=StringOf(b);
  {$ELSE}
  BinToHex(@d.Bytes[0], PAnsiChar(s), Length(d.Bytes));
  {$ENDIF}

  s:=LowerCase(s);
  contentMD5:=EncodeBase64(PAnsiChar(s),Length(s));
  stringToSign := composeStringToSign(
    'POST',
    contentMD5,
    sContentType,
    sDate,
    'x-fc-account-id:'+accountID,
    path);
  signature := signString(stringToSign,'你的密钥');

  vItem:=req.Params.AddItem;
  vItem.Kind:=TRESTRequestParameterKind.pkHTTPHEADER;
  vItem.ContentType:=contentType;
  vItem.Options:=[TRESTRequestParameterOption.poDoNotEncode];
  vItem.Name:='authorization';
  vItem.Value:='FC 你的访问ID:'+signature;

  vItem:=req.Params.AddItem;
  vItem.Kind:=TRESTRequestParameterKind.pkHTTPHEADER;
  vItem.ContentType:=contentType;
  vItem.Options:=[TRESTRequestParameterOption.poDoNotEncode];
  vItem.Name:='host';
  vItem.Value:=host;

  vItem:=req.Params.AddItem;
  vItem.Kind:=TRESTRequestParameterKind.pkHTTPHEADER;
  vItem.ContentType:=contentType;
  vItem.Options:=[TRESTRequestParameterOption.poDoNotEncode];
  vItem.Name:='x-fc-account-id';
  vItem.Value:=accountID;

  vItem:=req.Params.AddItem;
  vItem.Kind:=TRESTRequestParameterKind.pkHTTPHEADER;
  vItem.ContentType:=contentType;
  vItem.Options:=[TRESTRequestParameterOption.poDoNotEncode];
  vItem.Name:='date';
  vItem.Value:=sDate;

  vItem:=req.Params.AddItem;
  vItem.Kind:=TRESTRequestParameterKind.pkHTTPHEADER;
  vItem.ContentType:=contentType;
  vItem.Options:=[TRESTRequestParameterOption.poDoNotEncode];
  vItem.Name:='content-md5';
  vItem.Value:=contentMD5;

  req.Accept:=sContentType;
  req.Client.ContentType:=sContentType;

  req.AddBody(body);
  req.Method:=TRESTRequestMethod.rmPOST;

  req.Execute;
  Result:=req.Response.JSONValue;
end;

end.
注意:

  1. MD5,HMAC-SHA256加密算法来自http://fundementals.sourceforge.net,delphi自带的IdHMACSHA256执行有错。
  2. 其中的fc.cn-shanghai.aliyuncs.com,根据你实际注册FC的服务区域修改。

修改说明: ================================================================================== 1 原版只支持Delphi XE,本版改为可以支持Delphi6/7,在Delphi6下编译运行通过 2 修正了原版无法支持中文名称的BUG 使用示例: ================================================================================== ossTemp := TAliOssFileSystem.Create(OSS_ACCESS_ID, OSS_ASSCESS_KEY, OSS_HOSTNAME); ossTemp.ChangeVolumn(sBucketName); ossTemp.UploadFile(sLocalFileName, sOSSFileName); ossTemp.Free; 原版说明: ================================================================================== 该SDK使用Delphi/Object Pascal编程语言编写,完整实现了阿里云OSS API的全部功能,并提 供了两套API:第一套API(类名:TAliOss)仿照OSS PHP SDK实现了全部函数,第二套API( 类名:TAliOssFileSystem)封装了TAliOss,并在其的基础上实现了类似于文件系统的API, 实现了包括“卷”、“文件夹”、“文件”等抽象概念,并提供相应的功能函数。 两套API面向的应用场景不同:TAliOssFileSystem适合于将OSS服务看作是一种文件系统的应 用,开发人员不必了解OSS API的内部参数及XML定义,可提高编程效率,使用方便;TAliOSS 适合于其他类型的应用,当编程人员需要更加定制化的调用或者需要更加灵活的参数设置时, 可以直接使用该SDK操作调用参数和返回值。两套API互不干扰,可以在项目中同时使用。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

火星牛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值