Не получается отправить JSON из Java на Flask сервер

102
20 августа 2019, 00:30

Я хочу отправить запрос на сервер сделанный на Flask запрос с данными в формате JSON(в некоторых случаях POST запрос, а в некоторых случаях GET) из программы написанной на Java. Я столкнулся со следующей проблемой, при отправке данных сервер выдает ошибку 500:

Traceback (most recent call last):
  File "E:\Programms\Anaconda\lib\site-packages\flask\app.py", line 2292, in wsgi_app
    response = self.full_dispatch_request()
  File "E:\Programms\Anaconda\lib\site-packages\flask\app.py", line 1815, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "E:\Programms\Anaconda\lib\site-packages\flask\app.py", line 1718, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "E:\Programms\Anaconda\lib\site-packages\flask\_compat.py", line 35, in reraise
    raise value
  File "E:\Programms\Anaconda\lib\site-packages\flask\app.py", line 1813, in full_dispatch_request
    rv = self.dispatch_request()
  File "E:\Programms\Anaconda\lib\site-packages\flask\app.py", line 1799, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "server.py", line 42, in change_user
    user_dict = json.loads(request.json)
  File "E:\Programms\Anaconda\lib\json\__init__.py", line 341, in loads
    raise TypeError(f'the JSON object must be str, bytes or bytearray, '
TypeError: the JSON object must be str, bytes or bytearray, not dict

При этом Flask сервер выглядит вот так:

import numpy as np
import pandas as pd
from os.path import isfile
from datetime import datetime
import sys
from flask import Flask, request
import json
app = Flask(__name__)
@app.route('/try_server', methods=['POST'])
def try_server():
    user_dict = json.loads(request.json)
    return 'OK'
app.run(host='0.0.0.0', port=666)

А запрос я осуществляю с помощью следующего кода написанного на Java:

import org.json.JSONObject;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
public class SendTest2001 {
    public static void main(String[] args) throws UnsupportedEncodingException {
        URL url;
        HttpURLConnection connection = null;
        String targetURL = "http://c7c8a0a3.ngrok.io/change_user";
        try {
            //Create connection
            url = new URL(targetURL);
            JSONObject jo = new JSONObject();
            jo.put("id", "148866618");
            jo.put("ves", "1e44");
            jo.put("rost", "1.77");
            jo.put("dr", "2018.09.20 23:15:19");
            connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("POST");
            connection.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
            //connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            connection.setRequestProperty("Content-Length", "" +
                    Integer.toString(jo.toString().getBytes("UTF-8").length));
            //       connection.setRequestProperty("Content-Language", "en-US");
            connection.setUseCaches(false);
            connection.setDoInput(true);
            connection.setDoOutput(true);
            //Send request
            DataOutputStream wr = new DataOutputStream(
                    connection.getOutputStream());
            wr.writeBytes(jo.toString());
            wr.flush();
            wr.close();
            //Get Response
            InputStream is = connection.getInputStream();
            BufferedReader rd = new BufferedReader(new InputStreamReader(is));
            String line;
            StringBuffer response = new StringBuffer();
            while ((line = rd.readLine()) != null) {
                response.append(line);
                response.append('\r');
            }
            System.out.println("Успех!");
            rd.close();
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("Ошибка");
        } finally {
            if (connection != null) {
                connection.disconnect();
            }
        }
    }
}
Answer 1

В request.json уже распарсенные данные, в виде словаря (dict) в вашем случае. Декодирование JSON происходит неявно, если задан соответствующий Content-Type.

user_dict = json.loads(request.json)

нужно заменить на

user_dict = request.json
READ ALSO
Как с помощью retorfit сделать rpcjson запрос

Как с помощью retorfit сделать rpcjson запрос

Нужно подключиться к удаленном апи по протоколу rpc json примерный формат такой

114
404 в mvc, spring, java

404 в mvc, spring, java

Точно такой же проект с другим названием работаетИмею MVC

110
Создание HashMap из List с использованием valueMapper

Создание HashMap из List с использованием valueMapper

Есть метод, которому в параметре передается список строк (List<String>), из этого списка мне необходимо составить Map<String,Long>, где ключом(key)...

111