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'。但遵循协议规范总是更好。