我正在创建一个可与Abbyy的OCR REST API配合使用的Azure逻辑应用程序。
我使用Create SAS URI by path
动作返回Web URL
。 Web URL
将包含SAS令牌的FQDN返回到我的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
参数,即使这样做,其值也将是错误的。 / p>
我确实找到了this问题,并且尝试通过调整代码以使用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链接是什么。然后我可以提出一个问题。
答案 0 :(得分:1)
解决了。
我基本上是在正确的轨道上,但是当我应该使用%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 ...
我已将(值由%2526
替换为%26
的替换(2018年8月17日)。显然,我的内裤扭曲了。一定是在尝试两次转义,这是不必要的。
尽管Microsoft似乎对SAS令牌进行了部分百分比编码,但我注意到它们使用=
对%3D
进行了百分比编码,但是,Abbyy API似乎并不关心=
。 (由邮递员测试)。
不确定更新1 为何起作用。可能是因为我将访问策略设置为blob(仅对blob进行了匿名读取访问),并将其设置回private并未生效,或者可能是错误的内容类型。无论如何,它起作用了,然后却没有。嗯,它用&
替换了%26
没问题,我也尝试转义=
,但是端点不喜欢它,通过Postman和Logic App进行了测试。
我的触发器实际上是一个C#BlobTrigger
* Azure Function应用程序,并且编写了生成SAS令牌的代码,因此我使用了dotnet的Uri.EscapeDataString()
方法:
字符串fullUrl = cloudBlobContainer.Uri +“ /” + blobName + sasToken;
string escapedUri = Uri.EscapeDataString(fullUrl);
log.LogInformation($"Full URL: {fullUrl}");
log.LogInformation($"Escaped URL: {escapedUri}");
return escapedUri;
刚刚看过这行,是由Logic App设计人员创建的:
"path": "/datasets/@{encodeURIComponent(encodeURIComponent('https://someaccount.sharepoint.com/sites/eps'))}/tables//items//attachments",
看起来像encodeURIComponent()
的函数可能与Uri.EscapedDataString
做相同的事情,并且会替换replace()
函数。我还没有测试。
*
我将功能应用程序用作触发器的原因在于成本。尽管有一个Logic App触发器在检测到新的Blob时运行,但它必须按照计划运行。我的计划是消费,我已经读过Logic App运行时MS收费,无论它是否做任何事情。恕我直言,每隔5秒触发一次任务效率低下,而90%的时间无事可做。该功能应用程序更适合我的要求,尽管如果该应用程序已进入睡眠状态,则显然有大约10分钟的“热身”时间。我可以忍受。