我正在创建一个Azure逻辑应用,以使用Abbyy的OCR REST API。
我使用返回Web URL
的Create 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 分钟的"预热"期。我可以忍受。