我有一个简单的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连接相关推荐

  1. python Flask 连接sqlite

    文章目录 Fask SQLite介绍 sqlite连接字符串 flask 连接 sqlite的源码 Fask Flask是一个使用 Python 编写的轻量级 Web 应用框架.其 WSGI 工具箱采 ...

  2. Java如何跨语言调用Python/R训练的模型

    在 如何使用sklearn进行在线实时预测(构建真实世界中可用的模型) 这篇文章中,我们使用 sklearn + flask 构建了一个实时预测的模型应用.无论是 sklearn 还是 flask,都 ...

  3. android和flask交互,java - 当我从Android向Flask Web服务发送参数时,如何解决“ SSL库故障”? - 堆栈内存溢出...

    我确实尝试将一些值作为" application / json "从Android应用程序发送到Flask Web服务. 这是我的Java代码 : Thread thread = ...

  4. 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 ...

  5. 人工智能开发语言排行榜: 不死Java, 不朽C/C++, 新贵Python

    看了这个排行榜, 小编只想说:流水的编程语言,铁打的Java,C/C++!! 人工智能的前景已经不用多说了,越来越多的人看重人工智能的前景,想要在这互联网的风口有一番作为.要做到这点,首先要确定进入人 ...

  6. GO、Java、C/C++、Python,这些编程语言谁才是王者?

    最近我加入了一个使用Go语言的项目组.由于此前对Go语言的了解还停留在理论认识的阶段,没有大型项目的经验,加入这个项目组让我算是真正体验了一把Go语言,职业技能树也更加丰富了起来. Go语言的很多语言 ...

  7. 图解数据结构 使用python_[java电子书] 图解数据结构-使用Python PDF 电子书 百度云 网盘下载_Java自学网...

    java自学网(www.javazx.com)-java论坛,java电子书推荐:< 图解数据结构--使用Python>% J. T6 H1 L: y! ~! T7 A6 F) E& ...

  8. java链接mysql mvc_MVC jsp+servlet+javabean 连接Mysql数据库測试demo

    首先我们应该了解什么是MVC: MVC包含三个部分 : ①View:由各种JSP页面组成. ②Controller:由各种Servlet组成,Controller就是将View和Model来进行匹配, ...

  9. JAVA程序连接hadoop HDFS服务报无法连接。

    2019独角兽企业重金招聘Python工程师标准>>> 在虚拟机部署hadoop的HDFS系统,在centos系统中敲各种操作命令,对文件读取.上传.删除等都没什么问题.但用JAVA ...

最新文章

  1. Linux2.6中的Slab层
  2. 阿里云云主机添加swap分区与swap性能优化
  3. kafka是单独的进城吗_【土地使用权】出现这些情况,您真的知道怎么办吗?
  4. 【week2】 构建之法 读后感及问题
  5. 【视频】如何正确焊接贴片、直插元件?
  6. vue项目统一响应_vue中使用$set实现深入响应式原理
  7. 语言inc c,汇编语言练习
  8. nfs挂载出错:mount.nfs: access denied by server while mounting
  9. java的Date.getTime()转换成C#的Datetime.ticks
  10. 马云:旧制造业要凉,贸易战至少得打20年(附演讲全文)
  11. C++中编译速度与平时代码规范
  12. wincc逻辑运算符_wincc逻辑运算符_wincc中表达式及公式
  13. java.util.zip.ZipException: invalid stored block lengths的错误
  14. IT运维工程师要会什么?
  15. 使用certbot openresty执行获取 Let’s Encrypt https 免费证书
  16. P1714 切蛋糕(线段树+前缀和)
  17. C#注册和注销全局快捷键
  18. matplotlib显示伪彩色图像及色度条
  19. 适合婚礼上唱的歌曲 流行情歌大串烧
  20. c++ 语法错误 : 缺少“;”(在“*”的前面)

热门文章

  1. C# 无边框异型窗体制作
  2. 初学者python笔记(json模块、pickle模块、xml模块、shelve模块)
  3. css3 中心点,用css3实现打点效果实例讲解
  4. 枚举算法:完美综合式
  5. allure 测试报告本地打开_Pytest和Allure测试框架(二)
  6. C++ list类的模拟实现
  7. 关于图像三通道和单通道的解释
  8. javafx-TableView 行颜色设置
  9. Tensorflow学习笔记(一)
  10. 大楼通信综合布线系统_什么是网络综合布线系统组成?网络综合布线系统如何选择线缆?...