Java调用树莓派Python Flask服务并接收处理返回响应的技术咨询
修复方案
1. Python侧调整
你的现有Python代码存在3个核心问题会影响响应返回,需要先修复:
- 路由注册顺序错误:所有
@app.route装饰的路由函数必须放在app.run()之前,否则服务启动后路由不会被注册,访问会返回404 - 默认监听地址限制:
app.run()默认只监听本地127.0.0.1,其他设备无法访问,需要修改为监听所有网卡 - 串口资源未释放:串口打开使用后需要及时关闭,避免端口占用导致后续请求失败
修复后代码示例:
import serial import time from flask import Flask, redirect, jsonify, url_for app = Flask(__name__) # 所有路由定义放在app.run()前面 @app.route('/light/on') def lights_on(): serialComs(b"on\n") line = serialComs(b"status\n") # 可选优化:直接返回JSON取消跳转,Java侧处理更简单 # return jsonify({'status': line}) return redirect('/' + line) @app.route("/light/off") def lights_off(): serialComs(b"off\n") line = serialComs(b"status\n") # return jsonify({'status': line}) return redirect('/' + line) @app.route("/light/status") def light_status(): status = serialComs(b"status\n") if status == "": status = "unknown" return jsonify({'status': status}) @app.route("/<lightstatus>") def lights(lightstatus): print(lightstatus) return jsonify({'status': lightstatus}) def serialComs(state): ser = serial.Serial('/dev/ttyAMA0',9600 , timeout=1) ser.flush() ser.write(state) time.sleep(0.5) line = ser.readline().decode('utf-8').rstrip() ser.close() # 用完关闭串口,避免资源占用 return line if __name__ == '__main__': app.debug = True # 监听所有网卡地址,允许其他设备访问 app.run(host='0.0.0.0')
2. Java侧调整
你的现有Java代码只发起了请求,没有读取响应流的内容,同时缺少重定向适配、超时配置,修复后代码示例:
import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; // 方法返回值可根据业务需要改为自定义对象 public String doSwitch(String urlString) { URL url = null; HttpURLConnection con = null; BufferedReader reader = null; StringBuilder response = new StringBuilder(); try { url = new URL(urlString); con = (HttpURLConnection) url.openConnection(); con.setRequestMethod("GET"); con.setRequestProperty("Accept", "application/json"); // 开启自动跟随重定向,适配现有Python侧的跳转逻辑 con.setInstanceFollowRedirects(true); // 配置超时,避免无限制等待挂起服务 con.setConnectTimeout(5000); con.setReadTimeout(10000); // 读取响应流内容 reader = new BufferedReader(new InputStreamReader(con.getInputStream())); String line; while ((line = reader.readLine()) != null) { response.append(line); } // 此处response.toString()就是Python返回的JSON字符串 // 后续可接入Jackson、Fastjson等JSON工具解析为Java对象,提取status字段 return response.toString(); } catch (IOException e) { log.error(String.format("An error occurred: %s", e)); throw new ConnectionFailedException("An error occurred", e); } finally { try { if (reader != null) { reader.close(); } } catch (IOException e) { log.error("流关闭失败", e); } if (con != null) { con.disconnect(); } } }
3. 学习参考要点
- Java
HttpURLConnection核心配置:重点掌握超时设置、重定向处理、响应流读取逻辑 - Java JSON工具使用:常用的Jackson、Fastjson均可,用来将返回的JSON字符串解析为Java对象,提取需要的业务字段
- Flask服务配置:路由注册规则、服务监听地址配置、响应格式设置
- 串口操作注意事项:打开使用后及时关闭,避免端口占用导致后续请求失败
内容的提问来源于stack exchange,提问作者Christiaan
相关产品推荐
相关产品推荐

