Flutter-Framework, сервер C # http и недопустимый код состояния ответа JSON-Header. - PullRequest
0 голосов
/ 22 октября 2018

, так как я новичок в flutter.io-app-framework и c # -http-sever (запрос и ответ), я борюсь с ошибкой около двух недель или около того.Я совершенно новичок в JSON.

Моя проблема - неверный заголовок JSON.Чтобы быть точным, моя Android Studio говорит что-то вроде «ошибка: HttpException: неверный код состояния ответа, uri = http://127.0.0.1:2508/user/1".

Ошибка возникает только при использовании приложения для запроса http. Мой Firefox и Chromeвсе в порядке. Результат показан как следует.

В моем приложении дартс / флаттер я просто отправляю запрос 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) {

  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 голосов
/ 22 октября 2018

Прежде всего, Я бы настоятельно рекомендовал использовать пакет сервера http, который обрабатывает такие вещи низкого уровня, как написание заголовков для вас! Кто-то приложил усилия для выполнения этого, проверив, что он соответствуетHTTP RFC, протестируйте его, а затем бесплатно раздайте!

Если это для задания или для изучения http, или у вас есть другие веские причины, достаточно справедливо.Но в остальном почти бессмысленно писать что-то подобное с нуля, где можно было бы вводить ошибки, которые трудно выявить.Вы можете не только вводить ошибки http, но и следить за тем, чтобы потоки выполнялись правильно, иначе вы можете столкнуться с проблемами, когда получите больше трафика.И вы сэкономите много времени, потому что кто-то другой уже разобрался со сложными вещами, поэтому вы можете сосредоточиться на том, чтобы делать то, что вы действительно хотите сделать.


Но для вашей проблемы - этоПохоже, что http-часть ответа не отформатирована совершенно правильно, потому что флаттер не распознает код ответа 200, который вы пытаетесь отправить (и, следовательно, не читает его).

Трудно сказатьбез того, чтобы вы на самом деле опубликовали, как выглядит http-ответ полностью, но я думаю, что это связано с дополнительным переводом строки.как HTTP / 1.1).

Также вы должны знать, что протокол HTTP на самом деле хочет \r\n для перевода строки , хотя все современные серверы / клиенты должны поддерживать только '\и еще.Но всегда лучше следовать спецификации протокола.

...