2 回答

TA貢獻(xiàn)1865條經(jīng)驗(yàn) 獲得超7個(gè)贊
正如上面 @TallChuck 的評(píng)論所述,您需要替換或刪除 URL 中的空格
URL url = new URL("http://127.0.0.1:5000/add?x=100&y=12&text='Test'");
我建議使用請(qǐng)求對(duì)象來(lái)檢索 GET 調(diào)用中的參數(shù)。
請(qǐng)求對(duì)象
要訪問(wèn) Flask 中的傳入數(shù)據(jù),您必須使用請(qǐng)求對(duì)象。請(qǐng)求對(duì)象保存來(lái)自請(qǐng)求的所有傳入數(shù)據(jù),其中包括 mimetype、referrer、IP 地址、原始數(shù)據(jù)、HTTP 方法和標(biāo)頭等。盡管請(qǐng)求對(duì)象保存的所有信息都可能有用,但我們只關(guān)注通常由端點(diǎn)調(diào)用者直接提供的數(shù)據(jù)。
正如在發(fā)布大量參數(shù)和數(shù)據(jù)的評(píng)論中提到的,此任務(wù)的更合適的實(shí)現(xiàn)可能是使用 POST 方法。
以下是后端 POST 相同實(shí)現(xiàn)的示例:
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 測(cè)試 POST 后端的簡(jiǎn)單方法:
curl -d '{"x":5, "y":10}' -H "Content-Type: application/json" -X POST http://localhost:5000/add
使用Java發(fā)布請(qǐng)求:
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貢獻(xiàn)1807條經(jīng)驗(yàn) 獲得超9個(gè)贊
你的 python 代碼有一個(gè)嚴(yán)重的設(shè)計(jì)缺陷,這會(huì)產(chǎn)生一個(gè)非常危險(xiǎn)的安全缺陷,并且(幸運(yùn)的是,考慮到安全缺陷的存在)是你的代碼無(wú)法工作的原因。
在 URL 中的簡(jiǎn)單字符串旁邊放置任何內(nèi)容都是不好的做法,因?yàn)椋?/p>
URL 應(yīng)該是地址,從語(yǔ)義上講,將它們用作數(shù)據(jù)載體沒(méi)有什么意義
它通常需要雜亂的代碼來(lái)生成和讀?。ㄔ谀氖纠?,您被迫使用
eval
來(lái)解析請(qǐng)求,這是極其危險(xiǎn)的)URL 的規(guī)則要求對(duì)字符進(jìn)行編碼(讀起來(lái)很糟糕
%20
等等)
如果您期望參數(shù)數(shù)量固定,則應(yīng)該使用查詢參數(shù),否則最好使用請(qǐng)求正文。考慮到你的邏輯是什么,我認(rèn)為使用查詢參數(shù)在語(yǔ)義上會(huì)更好(所以你的請(qǐng)求看起來(lái)像/add?x=100&y=1
)。
一般來(lái)說(shuō),eval
是你的敵人,而不是你的朋友,并且eval
通過(guò)網(wǎng)絡(luò)發(fā)送給你的東西是你的敵人。
添加回答
舉報(bào)