繁体   English   中英

Flutter-Framework,C#HTTP服务器和无效的JSON-Header的无效响应状态代码

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM