Flutter

Flutter API 통신을 간편하게 해주는 dio 라이브러리

해니01_15 2024. 9. 20. 09:33

API 통신을 하다보면 동일한 주소로 method만 바꿔서 통신하는 게 보통이다. 

이럴떄 보면 조금더 간편하게 할 수 없을까? 생각이 들때 사용하면 좋을 라이브러리이다. 

물론 사용하지 않고 구현해도 문제는 없다. 

 

 

[pub.dev]

 

dio | Dart package

A powerful HTTP networking package, supports Interceptors, Aborting and canceling a request, Custom adapters, Transformers, etc.

pub.dev

examples 에 보면 다양한 사용법이 설명 되어 있다. 

아래는 그걸 활용하여 만든 코드이다.   

 

 

[구현 예시]

1. API 통신에 필요한 값들을 모아 요청 함수를 만든다. 

 Future<String> requestApi(String message) {
    
    final Map<String, String> params = {
      'api_key': 'API키',
      'query': message
    };
    
    return httpCall(
        baseURL,
        method: "POST", // get, put, delete, patch 등등 변형 가능
        data: params,
        );
        
  }

 

 

2. httpCall 이라고 실질적으로 통신하는 구간을 만든다. 

 

안의 예시는 내가 통신을하면서 필요한 것들을 만들어 놓은 것으로 응답 값과 원하느 요청 값이 다르게 되면 개인에 맞춰 바꿔야한다! 

Future<String> httpCall(String url, {
  String method = 'GET',
  Map<String, dynamic>? data,
}) async {
  if (url.isEmpty) {
    return '';
  }
  
  //dio객체 생성 
  var dio = Dio();

  Response? response;

  try {
    switch (method) {
      case 'GET':
        {
          response = await dio.get(url, queryParameters: data);
          break;
        }
      case 'POST':
        {
          response = await dio.post(url, data: data);
          break;
        }
      case 'PUT':
        {
          response = await dio.put(url, data: data);
          break;
        }
      case 'DELETE':
        {
          response = await dio.delete(url, data: data);
          break;
        }
      case 'PATCH':
        {
          response = await dio.patch(url, data: data);
          break;
        }
    }

    if (response != null) {
    
    //이 부분은 각자의 응답에 맞춰서 변형
    
      String? responseData = response.data;
      responseData ??= '';
      final result = {
        'requestUrl': url,
        'statusCode': response.statusCode ?? 0,
        'statusMessage': response.statusMessage ?? '',
        'data': responseData,
      };
      final jsonResult = jsonEncode(result);
      return jsonResult;
    }
  } catch (e) {
    print(e);
  }
}

 

 

다음에는  Dio의 cancelToken 에 대하여 알아보쟈 ...