如何解决 400 statusCode 和 Unexpected character (at character 1) 错误?
How to solve 400 statusCode and Unexpected character (at character 1) error?
我有一个机器学习模型可以拍摄照片并 returns 进行预测,我将其上传到烧瓶服务器并在我使用 HTML 创建的网站上对其进行了测试并且它有效,但是当我尝试将它与 flutter 应用程序一起使用时,出现此错误:Unhandled Exception: FormatException: Unexpected character (at character 1) 当我尝试从我的应用程序上传图片时。另外,我得到的 statusCode 是 400 .. 这些是我的代码。
任何帮助将不胜感激。
This is my python code that I created the flask instance in ( I run it on my cmd when I try to establish a connection using the flutter app)
from flask import Flask, render_template, request, jsonify
import cv2
import numpy as np
import pandas as pd
import tensorflow
from tensorflow import keras
from tensorflow.python.keras import backend as k
app = Flask(__name__)
model = tensorflow.keras.models.load_model('model.h5')
@app.route('/')
def index():
return render_template("index.html", data="hey")
@app.route("/prediction", methods=["POST"])
def prediction():
img = request.files['img']
img.save("img.jpg")
image = cv2.imread("img.jpg")
image = cv2.resize(image, (224,224))
image = np.reshape(image, (1,224,224,3))
pred = model.predict(image)
pred = pred > 0.5
if(pred):
predd="Malignant"
else:
predd="Benign"
return jsonify({"prediction": predd,})
#this ip is my network's IPv4
#(I connected both my laptop and mobile to this WiFi while establishing the connection)
if __name__ == "__main__":
app.run(debug=False,host='192.168.1.103',port=5000)
And this is the code I used in flutter to establish the connection
sendImageToServer(File imageFile) async {
var stream = new http.ByteStream(imageFile.openRead());
stream.cast();
var length = await imageFile.length();
print(length);
//this ip is my network's IPv4
//(I connected both my laptop and mobile
//to this WiFi while establishing the connection)
var uri = Uri.parse('http://192.168.1.103:5000/prediction');
var request = new http.MultipartRequest("POST", uri);
var multipartFile = new http.MultipartFile('file', stream, length,
filename:
basename(imageFile.path));
request.files.add(multipartFile);
request.headers["Content-Type"] = 'multipart/form-data';
var streamedResponse = await request.send();
var response = await http.Response.fromStream(streamedResponse);
print(response);
final Map<String, dynamic> responseJson =
json.decode(response.toString()) as Map<String, dynamic>;
print(responseJson.toString());
pre = responseJson["prediction"];
print(pre);
setState(() {
prediction = pre;
});
}
Future getImage() async {
final image = await picker.getImage(source: ImageSource.gallery);
sendImageToServer(File(image.path));
setState(() {
fileImage = File(image.path);
sendImageToServer(fileImage);
});
}
Also this is what I get on the cmd when I send the request
192.168.1.108 - - [20/Mar/2021 19:14:39] "←[1m←[31mPOST /prediction HTTP/1.1←[0m" 400 -
更新答案
所以你得到的异常是告诉你服务器无法理解你发送的请求,我认为现在的问题是你在这里发送请求的密钥
var multipartFile = new http.MultipartFile('file', stream, length,
filename:
basename(imageFile.path));
在您的后端,您使用的是密钥“img”
img = request.files['img']
所以这些应该是一样的,试试下面的
var multipartFile = new http.MultipartFile('img', stream, length,
filename:
basename(imageFile.path));
我真的希望这会奏效,同时检查以下链接可能会帮助您更多地了解问题,
和计算器问题
旧答案
错误消息没有说明错误的确切位置,所以这样做,将您的代码添加到 try catch 块中,这样您就可以捕获抛出的任何异常并知道错误是什么。
try {
sendImageToServer(File imageFile) async {
var stream = new http.ByteStream(imageFile.openRead());
stream.cast();
var length = await imageFile.length();
print(length);
//this ip is my network's IPv4
//(I connected both my laptop and mobile
//to this WiFi while establishing the connection)
var uri = Uri.parse('http://192.168.1.103:5000/prediction');
var request = new http.MultipartRequest("POST", uri);
var multipartFile = new http.MultipartFile('file', stream, length,
filename:
basename(imageFile.path));
request.files.add(multipartFile);
request.headers["Content-Type"] = 'multipart/form-data';
var streamedResponse = await request.send();
var response = await http.Response.fromStream(streamedResponse);
//print(response);//this will print instance of response not the response itself
// i cleared this a bit so we can trace where the error started from
print(response.statusCode); // the status code of your response
print(response.reasonPhrase); // the reason it failed "in case it did"
print(response.body); // the body of the response -> this what you really interested in
}
} catch (e,s) {
// this is your life saver, it will tell you everything
// you need to know to trace the error (well mostly :D)
// note : this will catch any exceptions that is thrown in the code, this not related to the response
// the (e) is error it self so your should print that to know what is the error
print(e.toString());
// the (s) is the stackTrace, it will tell you when and where the error
// happened, so you should also print it
print(e.toString());
}
我有一个机器学习模型可以拍摄照片并 returns 进行预测,我将其上传到烧瓶服务器并在我使用 HTML 创建的网站上对其进行了测试并且它有效,但是当我尝试将它与 flutter 应用程序一起使用时,出现此错误:Unhandled Exception: FormatException: Unexpected character (at character 1) 当我尝试从我的应用程序上传图片时。另外,我得到的 statusCode 是 400 .. 这些是我的代码。 任何帮助将不胜感激。
This is my python code that I created the flask instance in ( I run it on my cmd when I try to establish a connection using the flutter app)
from flask import Flask, render_template, request, jsonify
import cv2
import numpy as np
import pandas as pd
import tensorflow
from tensorflow import keras
from tensorflow.python.keras import backend as k
app = Flask(__name__)
model = tensorflow.keras.models.load_model('model.h5')
@app.route('/')
def index():
return render_template("index.html", data="hey")
@app.route("/prediction", methods=["POST"])
def prediction():
img = request.files['img']
img.save("img.jpg")
image = cv2.imread("img.jpg")
image = cv2.resize(image, (224,224))
image = np.reshape(image, (1,224,224,3))
pred = model.predict(image)
pred = pred > 0.5
if(pred):
predd="Malignant"
else:
predd="Benign"
return jsonify({"prediction": predd,})
#this ip is my network's IPv4
#(I connected both my laptop and mobile to this WiFi while establishing the connection)
if __name__ == "__main__":
app.run(debug=False,host='192.168.1.103',port=5000)
And this is the code I used in flutter to establish the connection
sendImageToServer(File imageFile) async {
var stream = new http.ByteStream(imageFile.openRead());
stream.cast();
var length = await imageFile.length();
print(length);
//this ip is my network's IPv4
//(I connected both my laptop and mobile
//to this WiFi while establishing the connection)
var uri = Uri.parse('http://192.168.1.103:5000/prediction');
var request = new http.MultipartRequest("POST", uri);
var multipartFile = new http.MultipartFile('file', stream, length,
filename:
basename(imageFile.path));
request.files.add(multipartFile);
request.headers["Content-Type"] = 'multipart/form-data';
var streamedResponse = await request.send();
var response = await http.Response.fromStream(streamedResponse);
print(response);
final Map<String, dynamic> responseJson =
json.decode(response.toString()) as Map<String, dynamic>;
print(responseJson.toString());
pre = responseJson["prediction"];
print(pre);
setState(() {
prediction = pre;
});
}
Future getImage() async {
final image = await picker.getImage(source: ImageSource.gallery);
sendImageToServer(File(image.path));
setState(() {
fileImage = File(image.path);
sendImageToServer(fileImage);
});
}
Also this is what I get on the cmd when I send the request
192.168.1.108 - - [20/Mar/2021 19:14:39] "←[1m←[31mPOST /prediction HTTP/1.1←[0m" 400 -
更新答案
所以你得到的异常是告诉你服务器无法理解你发送的请求,我认为现在的问题是你在这里发送请求的密钥
var multipartFile = new http.MultipartFile('file', stream, length,
filename:
basename(imageFile.path));
在您的后端,您使用的是密钥“img”
img = request.files['img']
所以这些应该是一样的,试试下面的
var multipartFile = new http.MultipartFile('img', stream, length,
filename:
basename(imageFile.path));
我真的希望这会奏效,同时检查以下链接可能会帮助您更多地了解问题,
和
旧答案
错误消息没有说明错误的确切位置,所以这样做,将您的代码添加到 try catch 块中,这样您就可以捕获抛出的任何异常并知道错误是什么。
try {
sendImageToServer(File imageFile) async {
var stream = new http.ByteStream(imageFile.openRead());
stream.cast();
var length = await imageFile.length();
print(length);
//this ip is my network's IPv4
//(I connected both my laptop and mobile
//to this WiFi while establishing the connection)
var uri = Uri.parse('http://192.168.1.103:5000/prediction');
var request = new http.MultipartRequest("POST", uri);
var multipartFile = new http.MultipartFile('file', stream, length,
filename:
basename(imageFile.path));
request.files.add(multipartFile);
request.headers["Content-Type"] = 'multipart/form-data';
var streamedResponse = await request.send();
var response = await http.Response.fromStream(streamedResponse);
//print(response);//this will print instance of response not the response itself
// i cleared this a bit so we can trace where the error started from
print(response.statusCode); // the status code of your response
print(response.reasonPhrase); // the reason it failed "in case it did"
print(response.body); // the body of the response -> this what you really interested in
}
} catch (e,s) {
// this is your life saver, it will tell you everything
// you need to know to trace the error (well mostly :D)
// note : this will catch any exceptions that is thrown in the code, this not related to the response
// the (e) is error it self so your should print that to know what is the error
print(e.toString());
// the (s) is the stackTrace, it will tell you when and where the error
// happened, so you should also print it
print(e.toString());
}