第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

連接 Java 和 Python Flask

連接 Java 和 Python Flask

至尊寶的傳說(shuō) 2023-08-09 16:16:31
我有一個(gè)簡(jiǎn)單的 Flask API:from flask import Flask, jsonifyapp = Flask(__name__)@app.route('/')def hello_world():    return 'Hello World!'@app.route('/add/<params>', 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)現(xiàn)在,我想從 Java 調(diào)用這個(gè)方法并提取結(jié)果。我嘗試過(guò)使用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();        }    }}但這不起作用。在燒瓶服務(wù)器中,我收到一條錯(cuò)誤消息:代碼 400,消息請(qǐng)求語(yǔ)法錯(cuò)誤(“GET /add/{'x':100, 'y':1} HTTP/1.1”)“GET /add/{'x':100, 'y':1} HTTP/1.1” HTTPStatus.BAD_REQUEST -在 Java 代碼中,我收到錯(cuò)誤:線程“main”中的異常 java.lang.RuntimeException:失?。篐TTP 錯(cuò)誤代碼:-1 在 MyClass.main(MyClass.java:17)我究竟做錯(cuò)了什么?我的最終目標(biāo)是將字典對(duì)象傳遞給我的Python函數(shù)并將函數(shù)的響應(yīng)返回給java。該詞典可以包含超過(guò)一千個(gè)單詞的文本值。我怎樣才能實(shí)現(xiàn)這個(gè)目標(biāo)?
查看完整描述

2 回答

?
鴻蒙傳說(shuō)

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();

            }

        }

    }

}


查看完整回答
反對(duì) 回復(fù) 2023-08-09
?
函數(shù)式編程

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>

  1. URL 應(yīng)該是地址,從語(yǔ)義上講,將它們用作數(shù)據(jù)載體沒(méi)有什么意義

  2. 它通常需要雜亂的代碼來(lái)生成和讀?。ㄔ谀氖纠?,您被迫使用eval來(lái)解析請(qǐng)求,這是極其危險(xiǎn)的)

  3. 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ā)送給你的東西是你的敵人。

查看完整回答
反對(duì) 回復(fù) 2023-08-09
  • 2 回答
  • 0 關(guān)注
  • 173 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)