用 json 的 decode 方法可以把 JSON 类型的数据转换成 Dart 语言里的 Map 类型的数据,我们可以定义一个模型,然后继续把这个 Map 数据转换成一个特定的模型数据。这样在开发的时候就可以检查模型属性的类型,可以在编辑器里自动提供模型里可用的属性等等。
在应用的 lib/src/app 的下面,新建两个模型文件,放在 models 里面,先创建一个 user_model.dart,然后再创建一个 exception_response_model.dart 。
打开 user_model.dart,在文件里定义一个类,名字叫 UserModel,用户模型,在这个模型里描述一下应用里的用户数据 ,类里面添加这种模型数据里的一些属性,比如添加一个 String 类型的 name,再添加一个 String 类型的 password 。
通过一个 Map 类型的数据创建一个 UserModel 模型的数据,可以在这个模型类里面添加一个 fromJson 构造方法,UserModel.fromJson,这个方法需要一个 Map 类型的参数, 这个 Map 数据里的属性是 String,值是 dynamic,这个参数的名字可以叫 data 。 然后设置一下,让 name 属性的值等于 data 这个 Map 数据里的 name ,再设置一下 password 属性的值,等于 data 里的 password 。
复制一下定义的这个模型,打开 exception_response_model,粘贴到这里,在这个文件里定义一个 ExceptionResponseModel,用这个模型来描述一下响应回来的异常数据。
这种数据里面,有一个 int 类型的 statusCode,一个 String 类型的 error,还有一个 String 类型的 mesasge 数据。
请求服务接口的时候,如果出现了异常,服务接口响应回来的异常数据里面就会包含这几个属性。
下面也给这个模型定义一个 fromJson 构造方法,ExceptionResponseModel.fromJson ,设置一下 statusCode 属性的值,让它等于 data 里的 statusCode,还需要设置一下 error 的值,等于 data 里的 error,还有一个 message,让它等于 data 里的 message。
使用
打开 SignupService ,在这个服务的 signup 方法里,用一下刚才定义的这两个模型,这里可以用一个 switch ,用它检查一下 resposne 里的 statusCode ,添加一种情况,如果这个状态码是 201,说明成功创建了一个用户。这样我们就可以基于响应里的数据创建一个 UserModel 数据。
添加一个 user,用一下 UserModel 上的 fromJson 方法,把上面转换好的 Map 数据交给这个方法,responseBody 。
下面用 print ,输出 User 再加上 user 模型里的 name 属性的值,注意输入 user 的时候,会提示它里面可用的属性。
再添加一种情况,状态码是 400,如果响应的状态是 400 ,这种情况可以创建一个 exceptionResponse,用 ExceptionResponseModel 上的 fromJson ,把 responseBody 交给它。
然后用 print 输出 Exception ,后面加上 exceptionResponse 里的 message 。
测试
在应用的注册用户页面,输入用户名,密码,按一下 注册, 这次控制台上输出了一个 用户已经存在了,因为刚才这次请求得到的是个异常的响应,在应用里我们根据这个响应数据创建了一个 ExceptionResponseModel 模型,然后在控制台上输出了这个模型数据里的 message 这个属性的值。
修改一下要注册的用户名,重新再按一下 注册新用户,这次在控制台上输出的是注册成功以后,服务端响应回来的数据里的 name 属性的值。
得到了响应以后,在应用我们把响应的主体数据先转换成了一个 Map 类型的数据,然后又根据这个 Map 类型的数据转换成了一个 UserModel 模型数据,然后在控制台上输出了这个 UserModel 模型里的 name 属性的值。