说明
这里介绍四种平时常用的http请求方法:GET、POST、PUT、DELETE。
在官方的介绍文档中关于InvokeHTTP处理器的描述是这么说的:
An HTTP client processor which can interact with a configurable HTTP Endpoint. The destination URL and HTTP Method are configurable. FlowFile attributes are converted to HTTP headers and the FlowFile contents are included as the body of the request (if the HTTP Method is PUT, POST or PATCH).
大致意思是说:这是一个可以与 HTTP 端点交互的 HTTP 客户端处理器。处理器中的 URL 和 HTTP Method是可以配置的。处理器中的属性会转换为 HTTP的请求头,如果请求方法是 PUT、POST 或 PATCH那么处理器的内容将作为请求的正文(请求体)包含在内。
测试接口
这里给了几个处理器测试用到的接口,主别对应GET、POST、PUT、DELETE请求,测试的代码不涉及业务逻辑,只是简单用来配合测试处理器使用。
package com.example.common.resp;import com.example.common.enums.RespEnum;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@AllArgsConstructor
@NoArgsConstructor
@Data
public class Result {private Integer code;private String message;private Object data;// 省略部分代码。。。public static Result ok(Object data) {return ok(RespEnum.SUCCESS.getCode(), RespEnum.SUCCESS.getMessage(), data);}}=====================================================================================
测试接口
=====================================================================================package com.example.redis.controller;import com.alibaba.fastjson2.JSONObject;
import com.example.common.resp.Result;
import org.springframework.web.bind.annotation.*;import java.util.Map;@RestController
@RequestMapping("/test")
public class TestController {@GetMapping("/{id}")public Result getById(@PathVariable String id, @RequestParam Map<String, Object> query) {JSONObject res = new JSONObject();res.put("method", "GET");res.put("desc", "这个是get方法");res.put("id", id);res.put("query", query);return Result.ok(res);}@PostMapping("")public Result add(@RequestBody JSONObject body) {JSONObject res = new JSONObject();res.put("method", "POST");res.put("desc", "这个是post方法");res.put("body", body);return Result.ok(res);}@PutMapping("/{id}")public Result editById(@PathVariable String id, @RequestBody JSONObject body) {JSONObject res = new JSONObject();res.put("method", "PUT");res.put("desc", "这个是put方法");res.put("id", id);res.put("body", body);return Result.ok(res);}@DeleteMapping("/{id}")public Result deleteById(@PathVariable String id) {JSONObject res = new JSONObject();res.put("method", "DELETE");res.put("desc", "这个是delete方法");res.put("id", id);return Result.ok(res);}
}
发送GET请求
添加处理器:InvokeHTTP
点击工具栏左上角的Processor拖拽到画布中,筛选出InvokeHTTP处理器添加到画布中
配置处理器
双击添加的处理器,切换到SETTINGS,给处理器起个名字
起好名字后切换到PROPERTIES,配置以下内容,最后点击APPLY
添加自定义请求头
如果需要给请求头添加自定义属性的话,直接点击右上角的加号+添加即可,例如我这里添加一个myToken的请求头,这个时候发送的请求头里面便会携带该参数
测试处理器
方便测试,将InvokeHTTP处理器设置为10秒执行一次
同理添加LogAttribute处理器到画布中
修改LogAttribute处理器的配置,将PROPERTIES选项卡中Log Payload的属性值改为true
连接两个处理器,关联关系选择Response,最后点击ADD
将第一个InvokeHTTP处理器自身的RELATIONSHIPS除了Response之外全部选择terminate
将第二个LogAttribute处理器自身的的RELATIONSHIPS选择terminate
处理器全部显示如图所示则表示没问题,可以运行了
启动两个处理器,在画布空白位置鼠标右键,选择Start
在nifi的日志中可以看到每隔十秒钟便会打印一次接口返回的结果
发送POST请求
发送POST请求携带请求体数据我们需要借助另外一个处理器:GenerateFlowFile
添加处理器:GenerateFlowFile
配置处理器
双击添加的处理器,在SETTINGS选项卡中给处理器起个名称
切换到PROPERTIES选项卡,然后分别配置Custom Text和Mime Type两个属性的值,其他属性的值默认即可。
Custom Text:(官方解释)If Data Format is text and if Unique FlowFiles is false, then this custom text will be used as content of the generated FlowFiles and the File Size will be ignored。通俗的说就是如果Custom Text中的值是文本类型的并且Unique FlowFiles属性的值是false,则Custom Text中的值会当做流文件的内容,这样Custom Text中的值传到下一个处理器InvokeHTTP的时候便会作为请求体数据传到接口中。
添加处理器:InvokeHTTP
和发送GET请求一样,添加InvokeHTTP处理器,然后配置以下内容,post请求中的请求体来自于上一个处理器的内容
测试处理器
将第一个处理器GenerateFlowFile和第二个处理器InvokeHTTP连接,关联关系选择success
继续将第二个处理器InvokeHTTP和之前添加过的LogAttribute处理器进行连接,关联关系选择Response
同样的将InvokeHTTP处理器自身的RELATIONSHIPS除了Response之外全部选择terminate
同样的方便测试,将第一个处理器GenerateFlowFile设置为10秒执行一次,然后将POST方法对应的三个处理器分别启动(鼠标放到对应的处理器上然后右键选择Start启动)
查看nifi的日志,可以看到每隔十秒钟便会打印一次接口返回的结果
发送PUT请求
put请求和post请求是类似,处理器按照post请求的重新添加一遍即可,只需要将InvokeHTTP处理器里面的请求方法改为PUT,URL改为对应的请求路径即可。这里不再重复添加,下面是添加好之后的
测试结果
发送DELETE请求
put请求和get请求是类似,处理器按照get请求的重新添加一遍即可,只需要将InvokeHTTP处理器里面的请求方法改为DELETE,URL改为对应的请求路径即可。这里不再重复添加,下面是添加好之后的
测试结果
结束语
以上便是NIFI中关于InvokeHTTP的使用,如果有问题欢迎大家评论。