首先明确要解决什么问题,通常的低代码平台基本功能都很强大了,但是程序一定会有其业务的特殊性,光靠平台不一定能解决所有问题,这就需要我们去拓展平台的扩展能力,能够使用一些第三方工具或者通用http api这样的形式来扩展平台自身能力。api组件就是为了让用户能使用通用的http接口,扩展平台的通用能力。

在低代码产品中,很多产品往往支持用户去调用接口来实现自己的业务逻辑,这时往往需要一个功能去支持用户调用第三方api,如何实现这个一个组件以及怎样实现这样一个功能就成为了一个不可绕过的问题。当然,这样的产品也挺多的,像测试用到的postman就是一个很好的软件,是个非常nice的参考案例。




## api组件 ### 什么是api api全称是application interface,广义上程序暴漏的接口都是api,而现在我们主要使用的是http形式的接口,像postman这样的工具支持的也是http协议,现在主流的接口形式也是以http的形式存在的,当然我们需要知道的是还有http协议之外的其他形式接口,但我们主要使用的还是http协议。

http协议

要开发这样一个组件首先需要了解http协议的基本格式,http协议报文非常简单,需要知道http协议主要有三个组成要素。

  • 请求方式 资源地址 协议版本
  • 协议头
  • 协议体

api组件实现

【低代码】像Postman一样工作,轻量级API组件实现_低代码

实现代码

全部代码放在个人git上,欢迎star或者有好的建议请联系笔者。
https://github.com/haobinliu/light_api.git 个人GitHub: 源码地址.

  • 数据结构定义
package com.lbh.lightapi.model;

import java.util.Map;

/**
 * Copyright(c)lbhbinhao@163.com
 * @author liubinhao
 * @date 2022/2/19
 * ++++ ______                           ______             ______
 * +++/     /|                         /     /|           /     /|
 * +/_____/  |                       /_____/  |         /_____/  |
 * |     |   |                      |     |   |        |     |   |
 * |     |   |                      |     |   |________|     |   |
 * |     |   |                      |     |  /         |     |   |
 * |     |   |                      |     |/___________|     |   |
 * |     |   |___________________   |     |____________|     |   |
 * |     |  /                  / |  |     |   |        |     |   |
 * |     |/ _________________/  /   |     |  /         |     |  /
 * |_________________________|/b    |_____|/           |_____|/
 */

public class Api {

    private String method;

    private String uri;

    private Map<String,String> headers;

    private String body;

    public String getMethod() {
        return method;
    }

    public void setMethod(String method) {
        this.method = method;
    }

    public String getUri() {
        return uri;
    }

    public void setUri(String uri) {
        this.uri = uri;
    }

    public Map<String, String> getHeaders() {
        return headers;
    }

    public void setHeaders(Map<String, String> headers) {
        this.headers = headers;
    }

    public String getBody() {
        return body;
    }

    public void setBody(String body) {
        this.body = body;
    }
}
  • controller接口定义
package com.lbh.lightapi.controller;

import com.lbh.lightapi.model.Api;
import com.lbh.lightapi.service.ApiService;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;

@RestController
@RequestMapping("/api")
public class ApiController {

    @Resource
    private ApiService apiService;

    @PostMapping("/invoke")
    public String apiInvoke(@RequestBody Api api){
        return apiService.apiInvoke(api);
    }

    @GetMapping
    public String test(){
        return "hello world!";
    }
}
  • 业务实现(调用器调用API)
package com.lbh.lightapi.service.impl;

import com.lbh.lightapi.model.Api;
import com.lbh.lightapi.service.ApiService;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

import javax.annotation.Resource;
import java.util.Map;

/**
 * Copyright(c)lbhbinhao@163.com
 * @author liubinhao
 * @date 2022/2/19
 * ++++ ______                           ______             ______
 * +++/     /|                         /     /|           /     /|
 * +/_____/  |                       /_____/  |         /_____/  |
 * |     |   |                      |     |   |        |     |   |
 * |     |   |                      |     |   |________|     |   |
 * |     |   |                      |     |  /         |     |   |
 * |     |   |                      |     |/___________|     |   |
 * |     |   |___________________   |     |____________|     |   |
 * |     |  /                  / |  |     |   |        |     |   |
 * |     |/ _________________/  /   |     |  /         |     |  /
 * |_________________________|/b    |_____|/           |_____|/
 */
@Service
public class ApiServiceImpl implements ApiService {

    @Resource
    private RestTemplate restTemplate;

    @Override
    public String apiInvoke(Api api) {
        HttpMethod method = HttpMethod.resolve(api.getMethod().toUpperCase());
        if (method == null){
            throw new RuntimeException("No such request method!");
        }
        String uri = api.getUri();
        String body = api.getBody();
        Map<String, String> headers = api.getHeaders();
        return restTemplate.exchange(uri, method, transHttpHeaders(body, headers), String.class)
                .getBody();
    }

    private <T> HttpEntity<T> transHttpHeaders(T body, Map<String,String> headers){
        HttpHeaders httpHeaders = new HttpHeaders();
        headers.forEach(httpHeaders::add);
        return new HttpEntity<>(body, httpHeaders);
    }
}

测试

【低代码】像Postman一样工作,轻量级API组件实现_低代码_02


这样就实现了一个很简单的API组件,但是一个完整可用的模块,这样一个API组件还缺少了个人用户API的存储修改等相关功能,像Postman还可以像文件夹保存文件那样保存API,将这样一个模块完善还有很多可以做的功能,若读者有什么好的建议也可以联系笔者。