我在Nifi中有一个要求,我在其中循环浏览不同的HTTP S REST端点,并为某些端点提供不同的证书,为其他端点提供不同的用户名/密码。
我使用InvokeHTTP处理器发送请求,虽然URL采用表达式语言,但我无法使用表达式设置SSLContextService。
或者,我考虑使用ExecuteScript来调用这些端点,但是listed here in StackOverflow post;我仍然不知道如何通过脚本以编程方式调用外部服务。
任何帮助表示赞赏。
答案 0 :(得分:2)
只是为了好玩,创建了一个调用http。
的groovy脚本肯定可以避免使用它。我相信InvokeHTTP
处理器几乎涵盖了所有需求。
然而..打算在https://httpbin.org
致电测试休息服务/post
流程:GenerateFlowFile
(生成正文) - > EcecuteGroovyScript
(来电服务)
由GenerateFlowFile
生成的正文:{"id":123, "txt":"aaabbbccc"}
在ExecuteGroovyScript 1.5.0
中声明CTL.ssl1
属性并将其链接到StandardSSLContextService
现在是剧本:
@Grab(group='acme.groovy', module='acmehttp', version='20180301', transitive=false)
import groovyx.acme.net.AcmeHTTP
import org.apache.nifi.ssl.SSLContextService.ClientAuth
def ff=session.get()
if(!ff)return
def http
ff.write{ffIn, ffOut->
http = AcmeHTTP.post(
url: "https://httpbin.org/post", //base url
query: [aaa:"hello", bbb:"world!"], //query parameters
// send flowfile content (stream) as a body
body: ffIn,
headers:[
//assign content-type from flowfile `mime.type` attribute
"content-type":ff.'mime.type'
],
// you can declare `CTX.ssl1`, `CTX,.ssl2`,... processor properties and map them to SSLContextService
// then depending on some condition create different SSLContext
// in this case let's take `CTL.ssl1` service to create context
ssl: CTL["ssl"+1].createSSLContext(ClientAuth.WANT),
// the next commented line creates trust all ssl context:
//ssl: AcmeHTTP.getNaiveSSLContext(),
// the receiver that transfers url response stream to flowfile stream
receiver:{respStream, httpCtx-> ffOut << respStream }
)
}
//set response hesders as flow file attributes with 'http.header.' prefix
http.response.headers.each{ k,v-> ff['http.header.'+k]=v }
//status code and message
ff.'http.status.code' = http.response.code
ff.'http.status.message' = http.response.message
if( http.response.code < 400){
//transfer to success if response was ok
REL_SUCCESS << ff
}else{
//transfer to failure when response code is 400+
REL_FAILURE << ff
}