【问题标题】:post request in aqueduct dart yields 415 Media Type Unsupported渡槽飞镖中的发布请求产生 415 媒体类型不受支持
【发布时间】:2018-10-18 23:09:20
【问题描述】:

我一直在尝试处理渡槽中的邮寄请求。阅读文档后,这是我能够想出的 通道.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>

aquaduct 不提供 html 模板。这是一个不同的位置。 当我提交表单时,我的控制台日志。

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

为什么我看不到正文内容,我怎么能看到正文(表单值)

【问题讨论】:

    标签: post dart aqueduct


    【解决方案1】:

    您收到 415 Media Type Unsupported 错误。您可以在日志中看到这一点,您也会在您的客户响应中看到它。

    默认情况下,ResourceController 仅接受 application/json 数据。您必须在控制器中设置 acceptedContentTypes 才能获取表单数据。最简单的方法是覆盖ChatController 中的属性:

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

    【讨论】:

    • 我还应该指出,表单数据总是被解码为Map&lt;String, List&lt;String&gt;&gt;,因为可能有多个元素具有相同的键。在您的 Serializable 类型中,您需要将 id 和 name 都视为 List 并从中获取第一个元素。
    • 当我添加接受的ContentTypes 时,post 函数被调用,但是在扩展Serializable 的Chat 类中出现转换错误。尝试将 name String 转换为 List 错误似乎仍然存在。内部错误 500。
    • 你最初的 post 方法很好 - 当你绑定 body 时,它会自动解码,创建一个新的 Chat 对象,然后调用它的 readFromMap。您需要将您的属性声明为Strings。在readFromMap 中,您可以分配这些属性,例如id = map['id']?.first as String;
    【解决方案2】:

    对于所有未来有相同问题的寻求者,应将上述问题附加到 Joe Conway 的答案中。 在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")];
      ...
    

    到您的控制器,然后到您的可序列化类(在我的情况下为聊天类)。将字符串更改为列表。这些将如下所示

    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"});
      }
    

    我真诚地希望对将来遇到同样问题的人有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-25
      • 2015-06-17
      • 1970-01-01
      • 2020-04-21
      • 2016-11-21
      • 1970-01-01
      • 2014-05-10
      相关资源
      最近更新 更多