span8
span4
嗨fme'ers,
使用HTTPCaller调用web服务是一个经常出现的问题。尽管本周的问题非常具体地说明了问题是什么,但它突出了一个更大的问题,即不知道您的web服务的哪些组件适合HTTPCaller的哪些参数。
它对我额外兴趣,因为我本周自己有这个问题。所以,即使我没有得到所有答案,我都会写下我一直在学习的一些事情,希望有人在某些时候会发现它有用。
问)我试图通过HTTP POST联系外部API获得令牌返回。如果我在同一台电脑上使用Postman,一切都没问题。当我尝试在FME 2019中做同样的事情时,我得到错误。你知道为什么它在Postman中工作,而不是在HTTPcaller中吗?
一)最终的答案与编码有关。当你把内容放到一个网络形式的类型应用程序/ x-www-form-urlencoded
web服务希望将+或=等特殊字符编码为%2B和%3D,以避免与URL/URI中用于其他目的的字符混淆。在FME中通过TextEncoder转换器将内容放在一起创建了正确的编码。
但之前有一个对用户来说很常见的问题,让我们也看看这个问题。
好的,让我们说有人有一个web服务我们想要使用它。
在Frank的例子中,他向web服务发送用户名和密码,以获得令牌。以我为例,这周我向一个人工智能网络服务发送了一幅单色图像,以便获得一个彩色版本。这就是web服务可以做的事情。
我的web服务的文档告诉我,我应该使用的命令是这样的:
通常要与Web服务与FME一起使用,您可以使用ahttpcaller.变压器。所以我们把一个httpcaller放下来......
哇!这是一大堆参数!我怎么知道该放什么,放在哪里?web服务文档中提供的命令如何映射到此对话框中的参数?
顺便说一句,我在FME中做的第一件事就是打开记录调试在FME选项对话框中。
在FME培训中,我总是告诉用户不要打开这个选项。除非他们是认真的,因为它可以返回一些看起来令人担忧的消息,而这并不是真正的问题。
你猜怎么着?在这里,我真的很吝啬。Log Debug非常适合记录有关使用HTTP连接和传输发生的内容的额外信息。只是记住,之后将其关闭。
例如,打开日志调试,并运行一个简单的GET on亚搏在线safe.com.,我看到这条信息…
用户代理:FME / 2019.7.38.19822 libcurl / 7.65.2
这说明我们正在使用cURL,这很有趣,因为这是我的web服务提供的示例的格式。巧合吗?我认为不是。所以我们在这里做生意。我能感觉到。
但在我们了解如何映射这些项目之前,让我们看看Frank的场景……
弗兰克的问题表示,他的命令在邮递员正常工作。那邮差是什么?
好吧,假设邮递员是API客户端。这意味着它与HttpCaller变压器相同的东西,只有它更复杂的一点点。
如果你参加过我们的FME服务器API培训,我相信你会遇到Postman,因为它是一个在FME之外测试web服务API的好方法。像弗兰克,如果你能让它工作在邮差,那么你知道web服务工作,它应该是OK在FME。
所以邮差是一个很好的工具,我建议您下载并安装它。
不管怎样,《Postman》的设置是这样的,带有一个标题:
...和身体:
它是用同样的信息建立起来的,只是结构不同。我不确定Frank的web服务是如何提供这些细节的,或者它是如何映射到Postman的,但是我对它在cURL中的样子很感兴趣。
如果他可以单击对话框右侧标记的代码的按钮,请选择弗兰克,然后选择CURL选项。他善待这个,这就是返回的工具:
curl -X POST \ https://dummy_url \ -H 'cache-control: no-cache' \ -H 'content-type: application/x-www-form-urlencoded' \ -H ' postmin -token: f47655fc-deea-097d-6c30-a53950dc2506' \ -d 'grant_type=password&client_id=Portal&username=dummy_username&password=dummy_password'
有趣的是,我也可以采取由集压缩Web服务提供的卷曲样本并将其导入邮递员,以便我可以尝试在那里运行它。它看起来像这样:
和...
它成功地运行,所以我知道它应该是OK在FME。现在让我们看看我是如何映射cURL命令的,以及为什么它与Frank的不同……
很明显,你需要指定要连接的站点,这要么在cURL中,要么已经知道:
我使用POST方法,因为这是您通常用于发送数据或文件。它也可能出现在cURL命令中,就像Frank的命令一样。
cURL命令接下来引起我注意的是不同的标志。我有-H和-F,弗兰克有-H和-d。
邮差知识库有关于这些标志的文档.
弗兰克在发送数据(d),我发送一个形式(F).事实上,如果你看看我们在《Postman》中的设置,你就会发现其中的区别:
“形式数据”,就相当于-F标记。
那么,这对于FME和HTTPCaller意味着什么呢?
H是一个页眉,我们有一个专门用于页眉的部分。这就是我放api-key头文件的地方
因为,如果你们还记得,我的命令是:
-h'api-key:quickstart-qudjiglzignvbwluzy4uli4k'\
我只是使用一个已发布的参数,而不是硬编码密钥,但效果是一样的。
下一部分是身体。允许有各种类型的body,你可以用一个参数来指定它们。因为我的身体是格式类型,我选择Multipart/Form Data:
在选项中,我可以指定要上传的文件:
为什么姓名“图像”?因为从一开始就知道命令是:
-f'image=@/path/to/your/file.jpg'\
所以,我知道使用的密钥(标签?)的名称是图像.
对我来说已经足够了。如果有多个-f标志,那么我将把它们添加为单独的行。
但是Frank的x-www-form-urlencoded数据呢?不是-F标志,而是-d,意思是数据。所以他不会使用Multipart/Form Data选项,而是使用Specify Upload Body,就像这样:
谢谢@nielsgerrits用于信息和屏幕截图。
注意主体的所有部分都在-d标志下:
- d ' grant_type = password&client_id = Portal&username = dummy_username&password = dummy_password '
...将在这里(上面的截图不是一个确切的匹配)或在以前的转换器连接到一起的字符串。在本例中,它在先前的转换器中,后面跟着TextEncoder。
现在,您现在可以看到为什么需要将该字符串编码为“百分比编码”与TextEncoder,因为如果密码包括“=”字符(例如)将导致“password = xxxx”中具有相同字符的冲突部分。
现在我们都有了正确的方案。
有其他情况吗?嗯,是。有一件事,在HttpCaller中有一个关于查询字符串参数的整个部分。那会怎么工作?
有一个例子岗位 - 回声网站(它允许您测试各种场景)。URL是这样的:
https://postman-echo.com/get?foo1=bar1&foo2=bar2
如果我把它粘贴到Postman并导出为cURL,它看起来是这样的:
Curl --location --request获取'https://postman-echo.com/get?foo1=bar1&foo2=bar2'
从那时起,我假设如果查询的参数是URL的一部分,则定义?字符,然后它们应该是httpcaller中查询字符串参数的一部分,如:
另一个尚未涉及的部分是当你使用Upload From File选项时:
我被告知与-d(或data)标志相同,但使用文件而不是属性值。所以我认为弗兰克可以将他的内容放入文件中并将此参数指向该文件,将内容类型设置为文本(文本/平原)。
如果您希望看到我的示例的实际应用,请下载并安装自定义转换器来自FME Hub的ImageColorizer.
此外,当您完成使用时,不要忘记关闭日志调试!
本周一些其他值得注意的问题:
©2020安全亚搏在线软件公司|合法的