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

时间:2018-10-22 12:11:59

标签: c# http flutter response http-status-codes

由于我是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#服务器代码如下: 私人void 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响应中是否缺少任何必要的内容? 也许您有另一个启发性的想法可以为我提供帮助。

1 个答案:

答案 0 :(得分:0)

首先,我强烈建议您使用一个http服务器程序包来处理诸如为您编写标头之类的低级内容! HTTP RFC,对其进行测试,然后免费提供!

如果这是用于分配作业或学习http,或者您有其他一些充分的理由,则很公平。但是否则,从头开始编写这样的东西几乎是没有意义的,因为您可能会引入难以发现的错误。您不仅会引入http错误,而且还必须确保正确进行线程化,否则在获得更多流量时可能会遇到问题。而且您会节省很多时间,因为其他人已经弄清楚了这些困难的东西,因此您可以集中精力进行真正想要制造的东西。


但是对于您的问题-响应的http部分的格式似乎不正确,因为flutter无法识别您要发送的200个响应代码(因此无法读取)。 / p>

如果不真正发布完整的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,尽管所有现代服务器/客户端也应该仅支持'\ n'。但是最好遵循协议规范。