[英]Flutter-Framework, C# http server and an invalid JSON-Header s Invalid response status code
由于我是flutter.io-app-framework和c#-http-sever(请求和响应)的新手,所以我一直在为大约两个星期的错误而苦苦挣扎。 我完全不熟悉JSON。
我的问题是无效的JSON标头。 确切地说,我的Android Studio在说类似“错误:HttpException:无效的响应状态代码,uri = http://127.0.0.1:2508/user/1 ”。
仅在将应用程序用于http请求时才会发生该错误。 我的Firefox和Chrome的运行状况良好。 结果如预期显示。
在我的dart / flutter应用中,我只是发送一个http get请求,该请求的确如下所示:
Future<String> getData() async {
var response = await http.get(
Uri.encodeFull("http://127.0.0.1:2508/user/1"),
headers: {"Accept": "text/json"});
this.setState(() {
user = json.decode(response.body);
print(user[0]);
});
return "Success!";
}
我的C#服务器代码如下:private void HandleClient(TcpClient client){
StreamReader reader = new StreamReader(client.GetStream());
StreamWriter writer = new StreamWriter(client.GetStream());
String request = reader.ReadLine();
if (!String.IsNullOrEmpty(request))
{
Log.WriteLine("\nRequest: \n" + request);
string[] tokens = request.Split(' ');
Log.WriteLine("~~~~~ Tokens ~~~~~");
foreach (String token in tokens)
{
Log.WriteLine("~ " + token);
}
Log.WriteLine("~~~~~~~~~~~~~~~~~~\n");
String[] cmds = tokens[1].Split('/');
String cmd = cmds[1].ToUpper();
String json = "";
switch (cmd)
{
case "USER":
if ((cmds.Length >= 3) && (cmds[2] != ""))
{
json += Tools.toJSON(Data.GetBenutzer(Convert.ToInt16(cmds[2])));
}
break;
default:
break;
}
writer.WriteLine(VERSION + " \n200 OK\nServer: " + NAME + "\nContent-Type: text/json\nAccess-Control-Allow-Origin: *\n");
writer.WriteLine(json);
Log.WriteLine("~~~~~~ Json ~~~~~~\n" +
json + "\n" +
"~~~~~~~~~~~~~~~~~~\n");
writer.Flush();
writer.Close();
writer.Dispose();
}
}
JSON响应中是否缺少任何必要的内容? 也许您有另一个启发性的想法可以为我提供帮助。
首先, 我强烈建议您使用http服务器程序包来处理低级内容,例如为您编写标头! 已经有人去做这些工作,验证它是否符合HTTP RFC,对其进行测试,然后免费提供!
如果这是为了分配作业或学习http,或者您有其他一些充分的理由,那么很公平。 但是否则,从头开始编写这样的东西几乎是没有意义的,因为您可能会引入难以发现的错误。 您不仅会引入http错误,而且还必须确保正确进行线程化,否则在获得更多流量时可能会遇到问题。 而且,您将节省大量时间,因为其他人已经弄清楚了这些困难的东西,因此您可以集中精力进行真正想要制造的东西。
但是对于您的问题-响应的http部分的格式似乎不正确,因为flutter无法识别您尝试发送的200个响应代码(因此无法读取)。
如果不实际发布http响应的完整内容,很难说清楚,但是我认为这与额外的换行符有关。
您有writer.WriteLine(VERSION + " \\n200 OK\\nServer: "...
但我认为它应该是writer.WriteLine(VERSION + " 200 OK\\nServer: "
(假定版本类似于HTTP / 1.1)。
您还应该知道,尽管所有现代服务器/客户端也应该仅支持“ \\ n”,但HTTP协议实际上需要\\r\\n
作为换行符 。 但是最好遵循协议规范。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.