개발/flutter
Flutter - graphQL 인자값 넣어서 Mutation 하기
덤벨로퍼
2020. 10. 6. 17:33
지난번에 간단한 쿼리를 보내 결과값을 받는 테스트까지 해보았다.
이번에는 간단한 mutation 을 실행해보려한다.
mutation 은 이렇게 되어있다.
mutation{
updatePassword(input: $input)
}
유저의 비밀번호를 변경할것이며 input 값에는 기존 비밀번호 , 새로운 비밀번호가 들어잇는 Map 타입이될것이다.
{
oldPassword:xxxxx
newPassword:yyyyy
}
지난번과 같은 구조로 getGraphqlClient 를 사용해 서버와 통신할것이다.
Future<bool> updatePasswordConnection(UpdatePasswordModel model) {
return getGraphQLClient()
.query(_queryOptions(model))
.then(_toUpdatePasword);
}
graphQL클라이언트를 불러와 쿼리옵션으로 통신하고
결과값을 _toUpdatePasword (password오타) 로 보낸다.
지난번과달리 model 이라는 인자를 받아와 쿼리옵션에 넣어줬다.
이 model 안에 기존비밀번호 & 새 비밀번호 정보가 있다.
쿼리 옵션부터 보자
QueryOptions _queryOptions(UpdatePasswordModel model) {
return QueryOptions(
fetchPolicy: FetchPolicy.networkOnly,
documentNode: gql(_readUserConnectionQuery(model.toJSON())));
}
//쿼리
String _readUserConnectionQuery(Map<String, String> input) => '''
mutation{
updatePassword(input: $input)
}
''';
model 을 인자로 받아와 쿼리에 넣어준다.
toJSON은 model을 UpdatePasswordModel 타입에서 Map 타입으로 변환해 준다.
결국 이런식으로 서버에게 요청할것이다
mutation{
updatePassword(input: {
oldPassword:"oldPassword123"
newPassword:"newPassword1234"
})
}
저렇게 "" 큰따옴표 안에 String 이 들어가있지않으면 에러를 리턴할것이다.
따라서 큰따옴표 안에 String 을 넣어주던지
toJSON() 함수에서 json.encode함수를 사용해줘야한다.
Map<String, String> toJSON() => <String, String>{
'oldPassword': json.encode(oldPassword),
'newPassword': json.encode(newPassword),
};
결과값은 _toUpdatePassword에 리턴될것이다.
bool _toUpdatePasword(QueryResult queryResult) {
if (queryResult.hasException) {
throw queryResult.exception;
}
final bool result = queryResult.data['updatePassword'];
return result;
}