Я получаю «ошибку 400», возвращаемую из колбы.Когда вызов приходит из кода Java / Eclipse - PullRequest
0 голосов
/ 22 октября 2018

У меня есть проект в колбе для получения параметра, и он работает, если я звоню почтальоном.Но если я делаю это с помощью кода Java, он возвращает ошибку 400.

Колба:

@app.route('/predict', methods=["POST"])
def predict():
    print("\nPredict......")
    print(request.form)
    print(request.form['textToPredict'])
    print("\nPredict......2")
    print(request.form.get("textToPredict"))
    #print("Text...."+request.form['textToPredict'].toString())
    # new text to predict
    text_to_predict = [request.form['textToPredict'].lower()] #[request.form.get('textToPredict')]  # ["asmatica desde infancia ex fumante 15 am dopc em uso de o2 ha 1 ano em uso de alenia 400 /12  e formoterol 12    2 x dia mvdiminuido sra brn f 2 t s/s cta  rx pfp"]  # este deve retornar CID Z00
    #print("Text....:"+str(text_to_predict))
    # count_vect gera as posições dos vetores de cada palavra do texto.
    new = count_vect.transform(text_to_predict)

    # carrega o modelo treinado
    loaded_model = cPickle.load(open(fname, 'rb'))
    # faz a predição do novo texto de entrada
    result = loaded_model.predict(new)
    print(result)
    # accuracy_score(y_test, result)

    json_dict = request.get_json()
    text = ''.join(result)
    textPredicted = text
    data = {'textPredicted': textPredicted}
    return jsonify(data), 200

Вывод из Java (печатать код FLASK):

Predict......
ImmutableMultiDict([('{"textToPredict":"coriza"}', '')])
127.0.0.1 - - [22/Oct/2018 16:07:34] "POST /predict HTTP/1.1" 400 -

Вывод почтальона (напечатать код FLASK):

Predict......
ImmutableMultiDict([('textToPredict', 'coriza, dificuldade em respirar, febre, dor no corpo')])
coriza, dificuldade em respirar, febre, dor no corpo

Predict......2
coriza, dificuldade em respirar, febre, dor no corpo
['J06 ']
127.0.0.1 - - [22/Oct/2018 16:20:00] "POST /predict HTTP/1.1" 200 -

Java-код:

@POST
    // @Path("")
    private String predictCid(String predicaoVo) throws IOException {
        System.out.print("\nentrou no método predict");

        try {

            JSONObject jsonParam = new JSONObject();
            jsonParam.put("textToPredict", predicaoVo);
            String PARAMETROS = "{\ntextToPredict:"+predicaoVo+"\n}";
            URL url = new URL("http://127.0.0.1:5000/predict");
            HttpURLConnection postConnection = (HttpURLConnection) url.openConnection();
            postConnection.setRequestMethod("POST");
            postConnection.setRequestProperty("content-Type", "application/x-www-form-urlencoded");
            postConnection.setUseCaches(false);
            postConnection.setDoInput(true);
            postConnection.setDoOutput(true);

            // Send POST output.
            DataOutputStream printout = new DataOutputStream(postConnection.getOutputStream());
            BufferedWriter writer = new BufferedWriter(
                    new OutputStreamWriter(printout, "UTF-8"));
            System.out.print("\nParametros: "+jsonParam.toString());

            writer.write(jsonParam.toString());
            writer.flush();
            writer.close();
            //printout.writeBytes(jsonParam.toString());
            //printout.flush();
            printout.close();

            int responseCode = postConnection.getResponseCode();
            System.out.println("POST Response Code :  " + responseCode);
            System.out.println("POST Response Message : " + postConnection.getResponseMessage());


            if (responseCode == HttpURLConnection.HTTP_OK) { // success
                BufferedReader in = new BufferedReader(new InputStreamReader(postConnection.getInputStream()));
                String inputLine;
                StringBuffer response = new StringBuffer();
                while ((inputLine = in.readLine()) != null) {
                    response.append(inputLine);
                }
                in.close();
                // print result
                System.out.println(response.toString());
                return response.toString();
            } else {
                System.out.println("POST NOT WORKED");

            }

        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return "some string just to test"; // just a test
    }

Итак, похоже, моя ошибка в отправке сообщения, когда оно сделано из кода Java.

Не могу понять причину ошибки.Мне кажется, что этот параметр неверен при поступлении в колбу из-за выводов, которые он представляет.

Мне нужна помощь в решении этой проблемы.Спасибо.

1 Ответ

0 голосов
/ 22 октября 2018

Ваш код Java неверен, потому что вы пытаетесь отправить строку объекта json в данные формы, закодированные в URL.Похоже, ваш контроллер Flask ожидает форму param.Вы можете изменить свой код Java, как это

String urlParam  = "textToPredict="+predicaoVo;
byte[] postData  = urlParam.getBytes( StandardCharsets.UTF_8 );

int dataLength = postData.length;

postConnection.setRequestProperty( "Content-Length", Integer.toString(dataLength));

try( DataOutputStream wr = new DataOutputStream(postConnection.getOutputStream())) {
   wr.write(postData);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...