2 回答
TA贡献1865条经验 获得超7个赞
正如上面 @TallChuck 的评论所述,您需要替换或删除 URL 中的空格
URL url = new URL("http://127.0.0.1:5000/add?x=100&y=12&text='Test'");
我建议使用请求对象来检索 GET 调用中的参数。
请求对象
要访问 Flask 中的传入数据,您必须使用请求对象。请求对象保存来自请求的所有传入数据,其中包括 mimetype、referrer、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();
}
}
}
}
TA贡献1807条经验 获得超9个赞
你的 python 代码有一个严重的设计缺陷,这会产生一个非常危险的安全缺陷,并且(幸运的是,考虑到安全缺陷的存在)是你的代码无法工作的原因。
在 URL 中的简单字符串旁边放置任何内容都是不好的做法,因为:
URL 应该是地址,从语义上讲,将它们用作数据载体没有什么意义
它通常需要杂乱的代码来生成和读取(在您的示例中,您被迫使用
eval
来解析请求,这是极其危险的)URL 的规则要求对字符进行编码(读起来很糟糕
%20
等等)
如果您期望参数数量固定,则应该使用查询参数,否则最好使用请求正文。考虑到你的逻辑是什么,我认为使用查询参数在语义上会更好(所以你的请求看起来像/add?x=100&y=1
)。
一般来说,eval
是你的敌人,而不是你的朋友,并且eval
通过网络发送给你的东西是你的敌人。
添加回答
举报