Flutter-Framework、C# http 服务器和无效的 JSON-Header s 无效响应状态代码
Flutter-Framework, C# http server and an invalid JSON-Header s Invalid response status code
因为我是 flutter 的新手。io-app-framework 和 c#-http-sever(请求和响应),我在大约两周左右的时间里一直在为错误而苦苦挣扎。
我是 JSON.
的新手
我的问题是无效的 JSON header。准确地说,我的 Android 工作室说的是 "error: HttpException: Invalid response status code, 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# 服务器代码如下所示:
私有无效 HandleClient(TcpClient 客户端)
{
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 服务器包来处理底层的东西,比如为你编写 headers! 有人已经付出了努力做这些事情,验证它是否符合 HTTP RFC,测试它,然后免费赠送它!
如果这是为了作业或学习 http,或者您有其他充分的理由,这很公平。但除此之外,从头开始编写这样的东西几乎没有意义,因为你可能会引入难以找出的错误。您不仅会引入 http 错误,而且还必须确保正确执行线程处理,否则当您获得更多流量时可能 运行 出现问题。而且你会节省很多时间,因为其他人已经解决了困难的问题,所以你可以专注于制作你真正想制作的任何东西。
但对于您的问题 - 似乎响应的 http 部分格式不正确,因为 flutter 无法识别您尝试发送的 200 响应代码(因此不会读取它) .
如果您没有真正完整地发布 http 响应,则很难判断,但我认为这与额外的换行有关。
你有 writer.WriteLine(VERSION + " \n200 OK\nServer: "...
但我认为它应该是 writer.WriteLine(VERSION + " 200 OK\nServer: "
(假设版本类似于 HTTP/1.1)。
你还应该知道 HTTP protocol actually wants \r\n
for line feeds,尽管所有现代的 servers/clients 也应该能够支持 '\n'。但遵循协议规范总是更好。
因为我是 flutter 的新手。io-app-framework 和 c#-http-sever(请求和响应),我在大约两周左右的时间里一直在为错误而苦苦挣扎。 我是 JSON.
的新手我的问题是无效的 JSON header。准确地说,我的 Android 工作室说的是 "error: HttpException: Invalid response status code, 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# 服务器代码如下所示: 私有无效 HandleClient(TcpClient 客户端) {
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 服务器包来处理底层的东西,比如为你编写 headers! 有人已经付出了努力做这些事情,验证它是否符合 HTTP RFC,测试它,然后免费赠送它!
如果这是为了作业或学习 http,或者您有其他充分的理由,这很公平。但除此之外,从头开始编写这样的东西几乎没有意义,因为你可能会引入难以找出的错误。您不仅会引入 http 错误,而且还必须确保正确执行线程处理,否则当您获得更多流量时可能 运行 出现问题。而且你会节省很多时间,因为其他人已经解决了困难的问题,所以你可以专注于制作你真正想制作的任何东西。
但对于您的问题 - 似乎响应的 http 部分格式不正确,因为 flutter 无法识别您尝试发送的 200 响应代码(因此不会读取它) .
如果您没有真正完整地发布 http 响应,则很难判断,但我认为这与额外的换行有关。
你有 writer.WriteLine(VERSION + " \n200 OK\nServer: "...
但我认为它应该是 writer.WriteLine(VERSION + " 200 OK\nServer: "
(假设版本类似于 HTTP/1.1)。
你还应该知道 HTTP protocol actually wants \r\n
for line feeds,尽管所有现代的 servers/clients 也应该能够支持 '\n'。但遵循协议规范总是更好。