[Flutter] Http POST (json)

Programming/Flutter 2024. 3. 17. 01:55 Posted by 생각하는로뎅
반응형

1. HTTP API 통신을 위해 아래 라이브러리를 사용한다. 

 

https://pub.dev/packages/http

 

http | Dart package

A composable, multi-platform, Future-based API for HTTP requests.

pub.dev

 

 

2. pubspec.yaml

dependencies:
  flutter:
    sdk: flutter

  http: ^1.2.1

 

 

3. 결과를 수신(Response) 받을 클래스를 생성한다.

/// 결과 수신 객체
class ResultResponse {

  // 결과
  final bool result;

  const ResultResponse({required this.result});

  factory ResultResponse.fromJson(Map<String, dynamic> json) {
    return switch (json) {
      {
      'result': bool result,
      } =>
          ResultResponse(
            result: result,
          ),
      _ => throw const FormatException('Failed to load ResultResponse.'),
    };
  }
}

 

 

4. API 를 송신(Send) 하기 위한 login 메소드를 생성한다.

  import 'package:http/http.dart' as http;
  import 'dart:async';
  import 'dart:convert';
  
  /// api 통신
  Future<ResultResponse> login(String id, String password) async {
    final response = await http.post(
      Uri.parse("http://localhost/api경로"),
      headers: <String, String>{
        'Content-Type': 'application/json; charset=UTF-8',
      },
      body: jsonEncode(<String, String>{
        'email': id,
        "encryptedPassword" : password
      }),
    );

    if (response.statusCode == 200) {
      // 결과를 반환한다.
      return ResultResponse.fromJson(jsonDecode(response.body) as Map<String, dynamic>);
    } else {
      throw Exception('Failed to login.');
    }
  }

 

 

5. 버튼 혹은 액션을 취했을때, 위에서 만들었던 login 함수를 호출하고, Future 을 이용하여 결과를 확인한다.

 onPressed: () {
 
      // api 호출
      Future<ResultResponse> futureResult = login(idTextController.text, passwordTextController.text);

      // 결과가 이곳으로 들어온다.
      futureResult.then((value) {

          // 결과를 출력한다.
          debugPrint(value.result.toString());

      });
      
  },

 

반응형

[Flutter] CRC16 From Dart

Programming/Flutter 2024. 3. 10. 16:06 Posted by 생각하는로뎅
반응형

 

flutter dart language

crc16 checksum

 

import 'dart:typed_data';

/// crc 16 체크 유틸
///
/// @author 임성진
class CRCCheckUtil {
  static Uint16List crcTable = Uint16List(256);
  static int polynomial = 0x8005;

  static int checkCrc16(List<int> bytes) {
    int crc = 0x0000;
    for (final byte in bytes) {
      crc ^= byte << 8;
      for (int i = 0; i < 8; i++) {
        if ((crc & 0x8000) != 0) {
          crc = (crc << 1) ^ polynomial;
        } else {
          crc <<= 1;
        }
      }
    }
    return crc & 0xFFFF;
  }

  /// checkSum
  /// @param data 검증 데이터
  /// @param checkCrc crc
  /// @return true : 성공, false 실패
  static bool checkSum(Uint8List data, Uint8List checkCrc) {
    int crc = checkCrc16(data);
    Uint8List bCrc = fnShortToBytes(crc, 1);
    if (bCrc[0] == checkCrc[0] && bCrc[1] == checkCrc[1]) {
      return true;
    } else {
      return false;
    }
  }

  static Uint8List fnShortToBytes(int value, int order) {
    Uint8List temp;
    temp = Uint8List.fromList([(value & 0xFF00) >> 8, value & 0x00FF]);
    temp = fnChangeByteOrder(temp, order);
    return temp;
  }

  static Uint8List fnChangeByteOrder(Uint8List value, int Order) {
    int idx = value.length;
    Uint8List Temp = Uint8List(idx);
    if (Order == 1) {
      Temp = value;
    } else if (Order == 0) {
      for (int i = 0; i < idx; i++) {
        Temp[i] = value[idx - (i + 1)];
      }
    }
    return Temp;
  }
}
반응형
반응형

1. 사용 목적

 

  1) 특정한 값을 비동기 방식으로 결과를 받아서 처리할 때 사용한다.

  2) 여러 곳으로 결과를 알릴 때 사용한다.

 

 

2. StreamController

 

A controller with the stream it controls.
This controller allows sending data, error and done events on its stream.
This class can be used to create a simple stream that others can listen on, and to push events to that stream.
It's possible to check whether the stream is paused or not, and whether it has subscribers or not, as well as getting a callback when either of these change.

제어하는 스트림이 있는 컨트롤러입니다.
이 컨트롤러를 사용하면 스트림 에서 데이터, 오류 및 완료 이벤트를 보낼 수 있습니다 .
이 클래스를 사용하면 다른 사람이 수신할 수 있는 간단한 스트림을 만들고 해당 스트림에 이벤트를 푸시할 수 있습니다.
스트림이 일시 중지되었는지 여부, 구독자가 있는지 여부를 확인할 수 있을 뿐만 아니라 이러한 변경이 있을 때 콜백을 받을 수도 있습니다.

- 출처 : https://api.flutter.dev/flutter/dart-async/StreamController-class.html

 

StreamController class - dart:async library - Dart API

A controller with the stream it controls. This controller allows sending data, error and done events on its stream. This class can be used to create a simple stream that others can listen on, and to push events to that stream. It's possible to check whethe

api.flutter.dev

 

3. 예제(Example)

 

1) controller.dart

mport 'dart:async';

class Controller {

      // instance
     static Controller? controller;

     // 상태 broad cast stream
     StreamController stateStreamController = StreamController();

     /// instance 반환
     Controller? getInstance() {
         controller ??= Controller();
         return controller ;
     }

     /// 초기화
     void init(){
          getInstance();
     }

     /// 상태 체크 StreamController 반환
     StreamController? getStreamController() {

           // cloase 하지 않으면 이전에 사용한 stream 으로 인해서
           // fluuter tream has already been listened to 에러 발생
          stateStreamController.close();

          stateStreamController = StreamController();

          return stateStreamController;

     }

     /// BoradCast 전송
     void sendBroadCast(){
          // 상태 값 borad cast 알림
          stateStreamController.add("state");
     }
}

 

 

2) main.dart

        Controller? controller = Controller().getInstance();
        Stream? stateStream = controller?.getStreamController()?.stream;

        stateStream?.listen((event) {
            print("$event");
          },
          onDone: () {
            print('Done');
          },
          onError: (error) {
            print(error);
          },
        );

 

 

4. 설명

  controller.dart 에서 StreamController 객체를 생성하여

 

controller.dart

 

  stream 객체를 얻어와서

 

main.dart

 

   stateStream?. listen을 아래와 같이 구현 후,

 

main.dart

 

   StreamController 객체인 stateStreamController의 메서드 add를 추가하면,

 

controller.dart

 

   event의 값으로 데이터가 넘어온다.

 

main.dart

 

반응형

'Programming > Flutter' 카테고리의 다른 글

[Flutter] Http POST (json)  (0) 2024.03.17
[Flutter] CRC16 From Dart  (0) 2024.03.10
[Flutter] Flutter 시작하기 & 후기  (0) 2021.03.28