본문 바로가기
📱Mobile/🔥Flutter

[Flutter] 플러터 http GET, POST 사용하기, 요청(Request), 응답(Response)

by 후눅스 2023. 7. 4.
반응형

project/pubspec.yaml

 

http: 0.12.2 추가한다.

dependencies:
  flutter:
    sdk: flutter


  # The following adds the Cupertino Icons font to your application.
  # Use with the CupertinoIcons class for iOS style icons.
  cupertino_icons: ^0.1.3
  http: 0.12.2	//add
  
dev_dependencies:
  flutter_test:
    sdk: flutter

 

Session 제어를 위해 클래스를 만들고

그 안에서 헤더 쿠키 등 셋팅, 리스폰스의 응답을 각 상태코드에 따라서 얼럿을 띄우는 등의 작업분기를 추가한다.


Session 클래스를 생성한다.

import 'dart:convert';
import "package:http/http.dart" as http;

import 'codeCommon.dart';

class Session {
  Map<String, String> headers = {
    'Content-Type': 'application/json',
    'Accept': 'application/json',
  };

  Map<String, String> cookies = {};

  Future<dynamic> get(String url) async {
    print('get() url: $url');
    http.Response response =
        await http.get(Uri.encodeFull(url), headers: headers);
    final int statusCode = response.statusCode;
    if (statusCode < 200 || statusCode > 400 || json == null) {
      //코드 입력
    }
    return json.decode(utf8.decode(response.bodyBytes));
  }

  Future<dynamic> post(String url, dynamic data) async {
    print('post() url: $url');
    http.Response response = await http.post(Uri.encodeFull(url),
        body: json.encode(data), headers: headers);
    final int statusCode = response.statusCode;
    if (statusCode < 200 || statusCode > 400 || json == null) {
      //코드 입력
    }
    return json.decode(utf8.decode(response.bodyBytes));
  }
}

 

 

final http.Response response = await new Session().post('$url/sample/user/login', null);

간단한 post 요청

요청데이터가 없는경우 null 을 넘겨주면 된다.

 

class ResponseVO {
  final dynamic code;
  final dynamic message;
  final dynamic timestamp;
  final dynamic response;

  ResponseVO({this.code, this.message, this.timestamp, this.response});

  factory ResponseVO.fromJSON(Map<String, dynamic> json) {
    print('responseVO.code : ${json['code']}');
    print('responseVO.message : ${json['message']}');
    print('responseVO.timestamp : ${json['timestamp']}');
    print('responseVO.response : ${json['response']}');

    return ResponseVO(
      code: json['code'],
      message: json['message'],
      timestamp: json['timestamp'],
      response: json['response'],
    );
  }
}

 

응답 JSON을 클래스로 맵핑하여 받는 post요청시의 사용예시이다.

Server Side의 ResponseVO를 만들어서 응답데이터를 맵핑해주었다.

final ResponseVO responseVO = ResponseVO.fromJSON(await new Session().post('$url/sample/user/login', null));
  if (responseVO != null) {
    if (responseVO.code == SUCCESS) {
      Navigator.pushNamed(context, PlazaPage.PlazaPageRouteName);
    } else if (responseVO.code == SERVER_ERROR) {
	    showToast('error');
    } else if (responseVO.code == INFORMATION_NOT_OBTAINED) {
    	Navigator.pushNamed(context, JoinPage.JoinPageRouteName);
    }
}

 

 

 

header 를 넣고싶지 않으면 두번째 인자로 null 을 넘기면 된다.

현재 코드에서는 Session클래스에서 값을 미리 정해놓고 고정으로 계속 보낸다.

  Map<String, String> headers = {
    'Content-Type': 'application/json',
    'Accept': 'application/json',
  };

헤더가 정해져있어서 요청시 매번 같이 보낸다.

 

 

 

더 요긴하게 쓰는 방법은 쿠키를 관리하면 된다.

반응형