본문 바로가기

Flutter-플러터/플러터 공부

Flutter X supabase X 공공데이터 북한 인물 조회

반응형

 

 

본격적으로 외식업 앱을 만들기 전에 공공데이터 API를 활용한 연습을 해봤다.

 

공공데이터 API를 이용하면서 주의할 점은 다음과 같다. 

 

1. API key값은 숨기기 

2. 공공데이터를 전체 받은 다음 내가 원하는 DB에 저장해서 사용하기 (공공 API에서 제한하는 조회수 아낄 수 있다.)

3.  공공API는 xml, json 파일 형식이므로 숫자도 String이라고 생각해야 한다. 

 

 

 

오늘 내가 진행한 작업은 

북한 인물조회 API 

 

Getx ,http를 사용하고 

supabase를 DB로 사용하였다. 

 

 

Controller 

- json 파일이 깨지는 바람에 UTF-8 코드를 사용하였다. 

- url에 필요한 변수 값을 넣어서 내가 원하는 값을 조회도 가능하게 할 수 있다. 

import 'dart:convert';

import 'package:get/get.dart';
import 'package:get/get_state_manager/get_state_manager.dart';
import 'package:get/instance_manager.dart';
import 'package:north_korea/key/key.dart';
import 'package:north_korea/model/north_person.dart';
import 'package:http/http.dart' as http;
import 'package:supabase_flutter/supabase_flutter.dart';

class HomePageController extends GetxController {
  static HomePageController get to => Get.find();

  RxList northPerson = <NorthPerson>[].obs;

  @override
  void onInit() {
    fetchNorthPersonData();
    super.onInit();
  }

  void fetchNorthPersonData() async {
    final String key =
        "";
    final String url =
        '';

    try {
      var response = await http.get(Uri.parse(url));

      if (response.statusCode == 200) {
        // UTF-8로 인코딩하여 응답 본문을 디코딩
        String decodedResponse = utf8.decode(response.bodyBytes);
        Map<String, dynamic> jsonData = json.decode(decodedResponse);
        List<dynamic> items = jsonData['items']; // 'items' 키로 접근
        northPerson.value =
            items.map((jsonItem) => NorthPerson.fromJson(jsonItem)).toList();
      } else {
        print('Request failed with status: ${response.statusCode}.');
      }
    } catch (e) {
      print('Exception occurred: $e');
    }
  }

  Future<dynamic> uploadToSupabase(NorthPerson person) async {
    try {
      var response = await Supabase.instance.client
          .from('NorthPerson')
          .upsert(person.toJson())
          .execute();

      if (response.status >= 200 && response.status < 300) {
        print('Data uploaded successfully');
      } else {
        print('Error during data upload');
      }
    } catch (e) {
      print('Exception occurred during data upload: $e');
    }
  }
}

 

 

json파일은 String으로 넘어오기 때문에 남, 녀 구분하는 코드에서 왜 작동이 안돼는지 잠시 헤맸다. 처음에는 1 만적음.. "1"이 정답

 

 

Floating버튼을 누르면 supabase 테이블에 저장이 완료

문제는 supabase에서는 json파일 그대로 저장이 됀다. 해서  1=남자, 2= 여자 쿼리문을 짜주었다. 

 

 

 

 

이 과정을 거치면서 풀스택 개발자 입문을 한듯한 느낌이 들어서 뿌듯했다.

외식업 앱을 만들면서 연습삼아 공공API를 가지고 토이 프로젝트를 진행을 해봐야겠다. 

 

목표는 한달에 한 개 만들기!

 

 

 

 

 

반응형