Я хочу отправить запрос на сервер сделанный на 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();
}
}
}
}
В request.json
уже распарсенные данные, в виде словаря (dict) в вашем случае. Декодирование JSON происходит неявно, если задан соответствующий Content-Type
.
user_dict = json.loads(request.json)
нужно заменить на
user_dict = request.json
Виртуальный выделенный сервер (VDS) становится отличным выбором
Нужно подключиться к удаленном апи по протоколу rpc json примерный формат такой
Есть метод, которому в параметре передается список строк (List<String>), из этого списка мне необходимо составить Map<String,Long>, где ключом(key)...
У меня есть Activity1java и Activity2