Dart OAuth使用渡槽时出错,ManagedPropertyType不匹配

Dart OAuth使用渡槽时出错,ManagedPropertyType不匹配,dart,aqueduct,Dart,Aqueduct,我正在使用OAuth钩子,它提供了一个全新的渡槽项目。我的数据采用以下方式进行URI编码: var form = body.keys .map((key) => "$key=${Uri.encodeQueryComponent(body[key])}") .join("&"); 我在尝试注册用户时收到以下错误: DataModelException:_User上的属性用户名类型不匹配,应为与ManagedPropertyType.string匹配的可分配类型,但获

我正在使用OAuth钩子,它提供了一个全新的渡槽项目。我的数据采用以下方式进行URI编码:

var form = body.keys
    .map((key) => "$key=${Uri.encodeQueryComponent(body[key])}")
    .join("&");
我在尝试注册用户时收到以下错误:

DataModelException:_User上的属性用户名类型不匹配,应为与ManagedPropertyType.string匹配的可分配类型,但获得了_ImmutableList#0 ManagedValueBacking.setValueForProperty

请求如下所示:

HttpRequest.request('/register', method: 'POST',
    sendData: form,
    requestHeaders: {
        "Content-Type": "application/x-www-form-urlencoded",
        "Authorization": "Basic $clientCredentials"
}).then((HttpRequest req) {
    ...
}).catchError((e) => _handleError(...));
我只是不太清楚为什么身体被解释为一个不可变的列表


我一定错过了什么

/register端点需要JSON数据

HttpRequest.request('/register', method: 'POST',
    sendData: JSON.encode(body),
    requestHeaders: {
        "Content-Type": "application/json; charset=utf-8",
        "Authorization": "Basic $clientCredentials"
});
不幸的是,这并不十分清楚-
HTTPController
默认同时允许JSON和表单数据,现在更改它可能会破坏某些人的代码;不过,该模板可以更好地完成这项工作

此错误的具体原因是表单数据和查询参数可以对同一个键有多个条目。渡槽对表单数据和查询参数的处理是相同的,并且总是将这些类型的输入解析为列表。由于
RegisterController
是一个
QueryController
,因此它需要一个JSON请求体,其中每个值都不是列表

您可以随时修改
RegisterController
以仅获取表单数据,而不是切换到JSON:

class RegisterController extends HTTPController {
  RegisterController(this.authServer) {
    acceptedContentTypes = [new ContentType("application", "x-www-form-urlencoded")];
  }
  AuthServer authServer;

  @httpPost
  Future<Response> createUser(
    @HTTPQuery("username") String username,
    @HTTPQuery("password") String password) async {

    var query = new Query<User>()
      ..values.username = username
      ..values.password = password;

    var salt = AuthUtility.generateRandomSalt();
    ...
class RegisterController扩展了HTTPController{
RegisterController(this.authServer){
acceptedContentTypes=[新的ContentType(“应用程序”,“x-www-form-urlencoded”)];
}
AuthServer;
@httpost
未来的createUser(
@HTTPQuery(“用户名”)字符串用户名,
@HTTPQuery(“密码”)字符串(密码)异步{
var query=新查询()
..values.username=用户名
..values.password=密码;
var salt=AuthUtility.generateRandomSalt();
...
注意:授权的端点确实需要表单数据(根据OAuth 2.0规范),但新项目中的其他所有内容都需要JSON数据