最近遇到的一个问题是需要从springboot的项目中调用另外一个python项目的机器学习模型等内容,之前的一篇文章讲的是利用Redis作为共享内存,从而实现在C++程序中调用python模型的方法,但这种方法的主要应用场景是离线环境(搭载在机器人上的miniPC)。而这次的项目中,python部分内容较多,除了加载机器学习模型之外还干了很多事情,如果全部将这些代码重写为Java工作量过于庞大,反之亦然。所以最终选择搭建RESTful服务器,在springboot项目中进行远程调用。

RESTful服务

关于restful的理解可以参考上面这篇文档。需要注意的是restful只是一种设计理念,并不是一种确定的规范。

这里为什么说选择restful类型的服务而不是其它类型的web呢?主要是以下两个原因:

  • 1.因为python那边代码是整个项目的核心,springboot项目主要是一个展示作用(其实代码也很多),以后可能会拓展到其它web项目;
  • 2.无需考虑任何安全问题,可以随心所欲的跨域
  • 3.传入一个参数,返回一个处理结果,这是典型的get操作。

简易python Web框架–flask_restful

  • 文档
  • 安装方式:

    pip install flask-restful

该框架十分简洁,几行代码就可以搭建出一个restful服务器,具体的使用方式在文档里有详细的描写。下面是我搭建服务器的主要代码:

from flask import Flask, request
    from flask_restful import Resource, Api
    from core.AJExtract2 import AJExtract2

    app = Flask(__name__)
    api = Api(app)
    # 初始化模型
    aj = AJExtract2()

    class CpwsRestful(Resource):

        def __init__(self):
            pass

        def get(self, file_name):
            global aj
            return aj.restful_interface(file_name)


    api.add_resource(CpwsRestful, '/<string:file_name>')

    if __name__ == '__main__':
    # 配置到服务时debug一定要改为false,开发时可以为true
        app.run(debug=True)

默认端口是5000,因此可以使用类似下面的url访问它:

localhost:5000/file_name

使用浏览器进行的测试

使用RestTemplate访问rest服务

restTemplate 是springboot提供的访问rest服务的工具,使用也是非常方便。

  • 安装

restTemplate 属于 starter-web,在maven中添加下面的依赖:

<dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-web</artifactId>
   </dependency>
使用步骤
  • 1.添加配置类
    @Configuration
    
    public class RestTemplateConfig {
    @Bean
    public RestTemplate restTemplate(ClientHttpRequestFactory factory){
        return new RestTemplate(factory);
    }
    
    @Bean
    public ClientHttpRequestFactory simpleClientHttpRequestFactory(){
        SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
        factory.setReadTimeout(5000);//单位为ms
        factory.setConnectTimeout(5000);//单位为ms
        return factory;
    }
    }

     

  • 2.调用
    @Override
    public String getAutoBpmnFile(String file_name) {
        //get json数据
        System.out.println("url:" + URL + file_name);
        JSONObject json = restTemplate.getForEntity(URL + file_name, JSONObject.class).getBody();
        System.out.println(json);
        return json.toJSONString()
        }

     

总结

至此,就解决了文章开头所述的问题。这里只是提供一种思路,针对不同的应用场景,有不同的解决方案。

点击量:6679


4 条评论

· 2021年4月20日 下午6:12

spring的第二步调用不知道该放在哪里,能发一下源码吗

    · 2021年4月20日 下午6:13

    793127553@qq.com谢谢!

    maicius · 2021年4月30日 下午11:54

    这个代码是从一个实习项目里摘抄出来的,不太好分享。那个调用就随便新建一个类就好了

关于同源策略的一点思考 – 小麦冬 · 2020年8月16日 上午2:21

[…] Flask_restful 真是个好框架,两三行代码就能搭建好restful服务器,具体参考快速搭建RESTful服务 […]

发表评论

电子邮件地址不会被公开。 必填项已用*标注