我一直在尝试处理渡槽中的张贴请求。阅读文档后,这就是我所能想到的 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
为什么我看不到身体内容,我怎么能看到身体(表单值)
答案 0 :(得分:1)
您收到415 Media Type Unsupported错误。您可以在日志中看到它,也可以在客户响应中看到它。
默认情况下,ResourceController
仅接受application/json
数据。您必须在控制器中设置acceptedContentTypes
才能获取表单数据。最简单的方法是覆盖ChatController
中的属性:
class ChatController {
...
@override
List<ContentType> acceptedContentTypes = [ContentType("application", "x-www-form-urlencoded")];
...
}
答案 1 :(得分:0)
对于所有具有相同问题的未来求职者,应在上述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")];
...
到您的控制器,然后到您的可序列化类(在我的案例聊天类中)。将String更改为列表。这些如下所示:
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]
};
}
}
最后更改您将methon发布到您的控制器中。
@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"});
}
我衷心希望能为以后遇到同样问题的人提供帮助。