在 Http 查询参数请求中使用 SAS 令牌的 Azure 逻辑应用



我正在创建一个Azure逻辑应用,以使用Abbyy的OCR REST API。

我使用返回Web URLCreate SAS URI by path操作。Web URL将 FQDN(包括 SAS 令牌(返回到我的 Blob。

Web URL作为查询参数传递给Http操作。在代码视图中,JSON 的相关部分如下所示:

"method": "GET",
"uri": "https://cloud.ocrsdk.com/processRemoteImage?source=@{body('Create_SAS_Uri_by_path')?['WebUrl']}&language=English&exportformat=pdfSearchable&description=blah&imageSource=scanner"

该 uri 解析方式如下:

https://cloud.ocrsdk.com/processRemoteImage?source=https://mysaaccount.blob.core.windows.net/inbox/180730110047_0001.pdf?sv=2017-04-17&sr=b&sig=2IGMt1qDZthaBSyvD3WJ6T1zc36Wr%2FNoiB4Wki5Lf28%3D&se=2018-08-16T11%3A16%3A48Z&sp=r&language=English&exportformat=pdfSearchable&description=blah&imageSource=scanner"

这会导致错误 (450(:

<?xml version="1.0" encoding="utf-8"?><error><message language="english">Invalid parameter: sr</message></error>

这基本上是从 SAS 令牌中获取sr=查询参数,当然,API 没有sr参数,即使有,它的值也是错误的。

我确实发现了这个问题,我尝试通过调整我的代码以使用replace函数来"百分比转义"与号 (&(,因此:

"method": "GET",
"uri": "https://cloud.ocrsdk.com/processRemoteImage?source=@{replace(body('Create_SAS_Uri_by_path')?['WebUrl'],'%26','%2526' )}&language=English&exportformat=pdfSearchable&description=blah&imageSource=scanner"

但是,这没有任何效果。即生成的 URI 与上述相同。有趣的是,SAS令牌本身似乎已经使用了"百分比逃逸"。

如果有人对如何解决或解决此问题有任何建议,如果您能分享您的想法,我将非常高兴。

有谁知道 LogicApp 操作是否是开源的,如果是,GitHub 链接是什么。然后我可以提出一个问题。

解决了。

基本上,我走在正确的轨道上,但是当我应该使用&时,我使用了%26,因此使用上面的代码,它应该为:

"method": "GET",
"uri": "https://cloud.ocrsdk.com/processRemoteImage?source=@{replace(body('Create_SAS_Uri_by_path')?['WebUrl'],'&','%26' )}&language=English&exportformat=pdfSearchable&description=blah&imageSource=scanner"

因此,URI 显示为:

https://cloud.ocrsdk.com/processRemoteImage?source=https://mysaaccount.blob.core.windows.net/intray/180730110047_0001.pdf?st=2018-08-17T10%3A55%3A38Z%26se=2018-08-18T10%3A55%3A38Z%26sp=r%26sv=2018-03-28%26sr=b%26sig=FTRoVgV7MRz5d5gTgrEs6D0QSy3268BqscZX1LHbJYQ%3D&language=English&exportformat=pdfSearchable&description=blah&imageSource=scanner

下一步:将 XML 正文转换为 JSON...

更新 1

我已经更新了(17/08/2018(从%2526%26的值替换。我显然把我的短裤弄得很糟糕。一定是试图双重逃跑,这是不需要的。

尽管Microsoft似乎对 SAS 令牌进行了部分百分比编码,但我注意到他们使用%3D=进行了百分比编码,但是,Abbyy API 似乎并不关心=。(邮递员测试(。

更新 2

不知道为什么更新 1确实有效。这可能是因为我将访问策略设置为 blob(仅限 blob 的匿名读取访问(,并将其设置回私有尚未生效,或者可能是错误的内容类型。无论如何,它有效,然后它没有。好吧,它毫无问题地用%26替换了&,我也尝试转义=,但端点不喜欢它,通过 Postman 和逻辑应用进行测试。

我的触发器实际上是 C#BlobTrigger* Azure 函数应用,并且我编写了代码来生成 SAS 令牌,因此我使用了 dotnet 的Uri.EscapeDataString()方法: string fullUrl = cloudBlobContainer.Uri + "/" + blobName + sasToken;

string escapedUri = Uri.EscapeDataString(fullUrl);
log.LogInformation($"Full URL: {fullUrl}");
log.LogInformation($"Escaped URL: {escapedUri}");
return escapedUri;

更新 3

刚刚看到由逻辑应用设计器创建的这一行:

"path": "/datasets/@{encodeURIComponent(encodeURIComponent('https://someaccount.sharepoint.com/sites/eps'))}/tables//items//attachments",

看起来encodeURIComponent()可能是一个与Uri.EscapedDataString做同样事情的函数,并且会替换replace()函数。我还没有测试过。

*,我使用函数应用作为触发器的原因归结为成本。尽管有一个在检测到新 Blob 时运行的逻辑应用触发器,但它必须按计划运行。我的计划是消耗,我已经读到逻辑应用运行时 MS 收费,无论它是否执行任何操作。 恕我直言,每 5 秒触发一次任务效率低下,而 90% 的时间它没有任何可做。函数应用更适合我的要求,尽管如果应用已进入睡眠状态,显然会有 ~10 分钟的"预热"期。我可以忍受。

相关内容

  • 没有找到相关文章

最新更新