java flask_将Java与Python Flask连接
我有一个简单的Flask API:
from flask import Flask, jsonify
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World!'
@app.route('/add/', methods = ['GET'])
def add_numbers(params):
#params is expected to be a dictionary: {'x': 1, 'y':2}
params = eval(params)
return jsonify({'sum': params['x'] + params['y']})
if __name__ == '__main__':
app.run(debug=True)
现在,我想从Java调用此方法并提取结果。我尝试使用java.net.URL和java.net.HttpURLConnection;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
public class MyClass {
public static void main(String[] args) {
try {
URL url = new URL("http://127.0.0.1:5000/add/{'x':100, 'y':1}");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("Accept", "application/json");
if (conn.getResponseCode() != 200) {
throw new RuntimeException("Failed : HTTP error code : "
+ conn.getResponseCode());
}
BufferedReader br = new BufferedReader(new InputStreamReader(
(conn.getInputStream())));
String output;
System.out.println("Output from Server .... \n");
while ((output = br.readLine()) != null) {
System.out.println(output);
}
conn.disconnect();
} catch (MalformedURLException e) {
e.printStackTrace();
}catch (IOException e){
e.printStackTrace();
}
}
}
但这是行不通的。在烧瓶服务器中,我收到一条错误消息:
代码400,消息错误的请求语法(“ GET / add / {'x':100,'y':1} HTTP / 1.1“)
“ GET / add / {'x':100,'y':1} HTTP / 1.1” HTTPStatus.BAD_REQUEST-
在Java代码中,我得到了错误:
线程“主”中的异常java.lang.RuntimeException:失败:HTTP错误代码:MyClass.main(MyClass.java:17)-1
我究竟做错了什么?
我的最终目标是将字典对象传递给我的python函数,并将函数的响应返回给java。该词典可以包含超过一千个单词的文本值。我该如何实现?
编辑
根据评论和答案,我更新了Flask代码,以避免使用eval并进行更好的设计:
@app.route('/add/', methods = ['GET'])
def add_numbers():
params = {'x': int(request.args['x']), 'y': int(request.args['y']), 'text': request.args['text']}
print(params['text'])
return jsonify({'sum': params['x'] + params['y']})
现在,我的网址是:"http://127.0.0.1:5000/add?x=100&y=12&text='Test'"
这是否更好?
解决方案
从上述@TallChuck的评论开始,您需要替换或删除URL中的空格
URL url = new URL("http://127.0.0.1:5000/add?x=100&y=12&text='Test'");
我建议利用请求对象来检索GET调用中的参数。
请求对象
要访问Flask中的传入数据,您必须使用请求对象。请求对象保存来自请求的所有传入数据,其中包括mimetype,引荐来源网址,IP地址,原始数据,HTTP方法和标头等。尽管请求对象持有的所有信息可能都是有用的,但我们仅关注通常由端点调用者直接提供的数据。
如发表大量参数和数据的注释中所述,对此任务更合适的实现可能是使用POST方法。
这是有关后端中POST的相同实现的示例:
from flask import Flask, jsonify, request
import json
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World!'
@app.route('/add/', methods = ['POST'])
def add_numbers():
if request.method == 'POST':
decoded_data = request.data.decode('utf-8')
params = json.loads(decoded_data)
return jsonify({'sum': params['x'] + params['y']})
if __name__ == '__main__':
app.run(debug=True)
这是使用cURL测试POST后端的简单方法:
curl -d '{"x":5, "y":10}' -H "Content-Type: application/json" -X POST http://localhost:5000/add
使用Java发布请求:
import java.io.*;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.nio.charset.StandardCharsets;
public class PostClass {
public static void main(String args[]){
HttpURLConnection conn = null;
DataOutputStream os = null;
try{
URL url = new URL("http://127.0.0.1:5000/add/"); //important to add the trailing slash after add
String[] inputData = {"{\"x\": 5, \"y\": 8, \"text\":\"random text\"}",
"{\"x\":5, \"y\":14, \"text\":\"testing\"}"};
for(String input: inputData){
byte[] postData = input.getBytes(StandardCharsets.UTF_8);
conn = (HttpURLConnection) url.openConnection();
conn.setDoOutput(true);
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/json");
conn.setRequestProperty( "charset", "utf-8");
conn.setRequestProperty("Content-Length", Integer.toString(input.length()));
os = new DataOutputStream(conn.getOutputStream());
os.write(postData);
os.flush();
if (conn.getResponseCode() != 200) {
throw new RuntimeException("Failed : HTTP error code : "
+ conn.getResponseCode());
}
BufferedReader br = new BufferedReader(new InputStreamReader(
(conn.getInputStream())));
String output;
System.out.println("Output from Server .... \n");
while ((output = br.readLine()) != null) {
System.out.println(output);
}
conn.disconnect();
}
} catch (MalformedURLException e) {
e.printStackTrace();
}catch (IOException e){
e.printStackTrace();
}finally
{
if(conn != null)
{
conn.disconnect();
}
}
}
}
java flask_将Java与Python Flask连接相关推荐
- python Flask 连接sqlite
文章目录 Fask SQLite介绍 sqlite连接字符串 flask 连接 sqlite的源码 Fask Flask是一个使用 Python 编写的轻量级 Web 应用框架.其 WSGI 工具箱采 ...
- Java如何跨语言调用Python/R训练的模型
在 如何使用sklearn进行在线实时预测(构建真实世界中可用的模型) 这篇文章中,我们使用 sklearn + flask 构建了一个实时预测的模型应用.无论是 sklearn 还是 flask,都 ...
- android和flask交互,java - 当我从Android向Flask Web服务发送参数时,如何解决“ SSL库故障”? - 堆栈内存溢出...
我确实尝试将一些值作为" application / json "从Android应用程序发送到Flask Web服务. 这是我的Java代码 : Thread thread = ...
- Java解析SQL生成语法树_Atitit.sql ast 表达式 语法树 语法 解析原理与实现 java php c#.net js python...
Atitit.sql ast 表达式 语法树 语法 解析原理与实现java php c#.net js python 1.1.Sql语法树ast如下图锁死 2.SQL语句解析的思路和过程 2.1.le ...
- 人工智能开发语言排行榜: 不死Java, 不朽C/C++, 新贵Python
看了这个排行榜, 小编只想说:流水的编程语言,铁打的Java,C/C++!! 人工智能的前景已经不用多说了,越来越多的人看重人工智能的前景,想要在这互联网的风口有一番作为.要做到这点,首先要确定进入人 ...
- GO、Java、C/C++、Python,这些编程语言谁才是王者?
最近我加入了一个使用Go语言的项目组.由于此前对Go语言的了解还停留在理论认识的阶段,没有大型项目的经验,加入这个项目组让我算是真正体验了一把Go语言,职业技能树也更加丰富了起来. Go语言的很多语言 ...
- 图解数据结构 使用python_[java电子书] 图解数据结构-使用Python PDF 电子书 百度云 网盘下载_Java自学网...
java自学网(www.javazx.com)-java论坛,java电子书推荐:< 图解数据结构--使用Python>% J. T6 H1 L: y! ~! T7 A6 F) E& ...
- java链接mysql mvc_MVC jsp+servlet+javabean 连接Mysql数据库測试demo
首先我们应该了解什么是MVC: MVC包含三个部分 : ①View:由各种JSP页面组成. ②Controller:由各种Servlet组成,Controller就是将View和Model来进行匹配, ...
- JAVA程序连接hadoop HDFS服务报无法连接。
2019独角兽企业重金招聘Python工程师标准>>> 在虚拟机部署hadoop的HDFS系统,在centos系统中敲各种操作命令,对文件读取.上传.删除等都没什么问题.但用JAVA ...
最新文章
- Linux2.6中的Slab层
- 阿里云云主机添加swap分区与swap性能优化
- kafka是单独的进城吗_【土地使用权】出现这些情况,您真的知道怎么办吗?
- 【week2】 构建之法 读后感及问题
- 【视频】如何正确焊接贴片、直插元件?
- vue项目统一响应_vue中使用$set实现深入响应式原理
- 语言inc c,汇编语言练习
- nfs挂载出错:mount.nfs: access denied by server while mounting
- java的Date.getTime()转换成C#的Datetime.ticks
- 马云:旧制造业要凉,贸易战至少得打20年(附演讲全文)
- C++中编译速度与平时代码规范
- wincc逻辑运算符_wincc逻辑运算符_wincc中表达式及公式
- java.util.zip.ZipException: invalid stored block lengths的错误
- IT运维工程师要会什么?
- 使用certbot openresty执行获取 Let’s Encrypt https 免费证书
- P1714 切蛋糕(线段树+前缀和)
- C#注册和注销全局快捷键
- matplotlib显示伪彩色图像及色度条
- 适合婚礼上唱的歌曲 流行情歌大串烧
- c++ 语法错误 : 缺少“;”(在“*”的前面)
热门文章
- C# 无边框异型窗体制作
- 初学者python笔记(json模块、pickle模块、xml模块、shelve模块)
- css3 中心点,用css3实现打点效果实例讲解
- 枚举算法:完美综合式
- allure 测试报告本地打开_Pytest和Allure测试框架(二)
- C++ list类的模拟实现
- 关于图像三通道和单通道的解释
- javafx-TableView 行颜色设置
- Tensorflow学习笔记(一)
- 大楼通信综合布线系统_什么是网络综合布线系统组成?网络综合布线系统如何选择线缆?...