最近遇到的一个问题是需要从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服务器,具体的使用方式在文档里有详细的描写。下面是我搭建服务器的主要代码:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
    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中添加下面的依赖:


1
2
3
4
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
使用步骤
  • 1.添加配置类
    
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    @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.调用
    
    
    1
    2
    3
    4
    5
    6
    7
    8
    @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()
        }

总结

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

点击量:346


发表评论

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