после запроса в акведуке дротик 415 Тип носителя не поддерживается - PullRequest
0 голосов
/ 19 октября 2018

Я пытался обработать почтовый запрос в акведуке.После прочтения документации я смог найти channel.dart

 router
.route("/chat")//"/chat/[:id]")
.link(() => ChatController());

chatController.dart

> import 'package:web_api/web_api.dart';

    class ChatController extends ResourceController{

      @Operation.get('id')
      Future<Response> getProjectById(@Bind.path("id") int id) async {
        // GET /chat/:id
        print(id);
        //return Response.ok({"key": "value"});
      }

      @Operation.post()
      Future<Response> createChat(@Bind.body() Chat chat) async {
        // POST /project

        print("post");
        final Map<String, dynamic> body = await request.body.decode();
        final name =body['name'] as String;
        print(" 1) name ==> $name");

        //return Response.ok({"key": "value"});
      }

    }
    class Chat extends Serializable{
       int id;
      String name;

      @override
      void readFromMap(Map<String, dynamic> map) {
        id = map['id'] as int;
        name = map['name'] as String;
      }

      @override
      Map<String, dynamic> asMap() {
        return {
          'id': id,
          'name': name
        };
      }
}

и, наконец, HTML-шаблон

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <form action="http://127.0.0.1:8888/chat" method="POST">
        <input id="id" name="id">
        <input id="name" name="name">
        <button type="submit">Submit</button>
    </form>

</body>
</html>

HTML-шаблон не обслуживается аквадуком.Это совсем другое место.Когда я отправляю форму, мои журналы консоли.

[INFO] aqueduct: Server aqueduct/2 started.  
[INFO] aqueduct: POST /chat 15ms 415  

почему я не вижу контуры тела, как я могу увидеть тело (значения формы)

Ответы [ 2 ]

0 голосов
/ 19 октября 2018

Всем будущим искателям с такой же проблемой следует добавить ответ Джо Конвея выше.в шаблоне html измените

  <form action="http://127.0.0.1:8888/chat" method="POST">

на

<form action="http://127.0.0.1:8888/chat" method="POST" enctype="application/x-www-form-urlencoded">

, затем добавьте

...
  @override
  List<ContentType> acceptedContentTypes = [ContentType("application", "x-www-form-urlencoded")];
  ...

к вашему контроллеру и затем к сериализуемому классу в моем классе чата case.измените строку на список. Это будет выглядеть следующим образом:

class Chat extends Serializable{
  List<String> id;
  List<String> name;

  @override
  void readFromMap(Map<String, dynamic> map) {
    id = map[0] as List<String>;
    name = map[1] as List<String>;
  }

  @override
  Map<String, dynamic> asMap() {
    return {
      'id': id[0],
      'name': name[1]
    };
  }
}

и, наконец, изменится, когда вы отправите метон в вашем контроллере.

@Operation.post()
  Future<Response> createProject(@Bind.body() Chat chat) async {
    // POST /project

    print("post");
    Map<String, List<String>> body = await request.body.decode();
    final name =body["name"][0] ;

    print("\n\n 1) body ==> $body");
     print("\n\n 1) name ==> $name");


    return Response.ok({"key": "value"});
  }

Я искренне надеюсь, что это поможет кому-то в будущемта же проблема.

0 голосов
/ 19 октября 2018

Вы получаете 415 Ошибка типа носителя не поддерживается.Это можно увидеть в журнале и в ответе клиента.

По умолчанию ResourceController принимает только данные application/json.Вы должны установить acceptedContentTypes в вашем контроллере для получения данных формы.Самый простой способ сделать это - переопределить свойство в ChatController:

class ChatController {
  ...
  @override
  List<ContentType> acceptedContentTypes = [ContentType("application", "x-www-form-urlencoded")];
  ...
}
...