Flutter Http


http 패키지 사용법

Flutter에서 http 패키지를 사용하면 간단하고 효율적으로 HTTP 요청을 보낼 수 있습니다. 이 패키지는 GET, POST, PUT, DELETE 등의 요청을 지원하며, JSON 데이터를 주고받는 데 유용합니다. 다음은 http 패키지를 사용하여 HTTP 요청을 보내는 방법을 설명합니다.

1. http 패키지 설치

먼저, pubspec.yaml 파일에 http 패키지를 추가합니다.

dependencies:
  flutter:
    sdk: flutter
  http: ^0.14.0

2. HTTP 요청 보내기

GET 요청

import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: HomePage(),
    );
  }
}

class HomePage extends StatefulWidget {
  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  String data = "Fetching data...";

  @override
  void initState() {
    super.initState();
    fetchData();
  }

  Future<void> fetchData() async {
    final response = await http.get(Uri.parse('https://jsonplaceholder.typicode.com/posts/1'));

    if (response.statusCode == 200) {
      setState(() {
        data = json.decode(response.body)['title'];
      });
    } else {
      setState(() {
        data = "Failed to load data";
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('HTTP GET Example')),
      body: Center(child: Text(data)),
    );
  }
}

POST 요청

import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: HomePage(),
    );
  }
}

class HomePage extends StatefulWidget {
  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  String data = "Waiting for response...";

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('HTTP POST Example')),
      body: Center(child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          Text(data),
          ElevatedButton(
            onPressed: sendData,
            child: Text('Send Data'),
          ),
        ],
      )),
    );
  }

  Future<void> sendData() async {
    final response = await http.post(
      Uri.parse('https://jsonplaceholder.typicode.com/posts'),
      headers: <String, String>{
        'Content-Type': 'application/json; charset=UTF-8',
      },
      body: jsonEncode(<String, String>{
        'title': 'foo',
        'body': 'bar',
        'userId': '1',
      }),
    );

    if (response.statusCode == 201) {
      setState(() {
        data = "Success: ${response.body}";
      });
    } else {
      setState(() {
        data = "Failed to post data";
      });
    }
  }
}

3. 에러 처리

HTTP 요청을 보낼 때 에러를 처리하는 방법을 알아보겠습니다. 에러 처리는 네트워크 오류, 서버 오류, 잘못된 응답 등을 포함합니다.

Future<void> fetchData() async {
  try {
    final response = await http.get(Uri.parse('https://jsonplaceholder.typicode.com/posts/1'));

    if (response.statusCode == 200) {
      setState(() {
        data = json.decode(response.body)['title'];
      });
    } else {
      setState(() {
        data = "Server error: ${response.statusCode}";
      });
    }
  } catch (e) {
    setState(() {
      data = "Failed to load data: $e";
    });
  }
}

4. JSON 데이터 파싱

Flutter에서 HTTP 요청의 응답으로 JSON 데이터를 받는 경우, dart:convert 패키지를 사용하여 JSON 데이터를 파싱할 수 있습니다.

import 'dart:convert';

void parseJson(String responseBody) {
  final parsed = json.decode(responseBody);
  // parsed 데이터를 사용하여 필요한 작업 수행
}

5. HTTP 패키지의 주요 기능

  • 헤더 설정: 요청에 필요한 헤더를 설정할 수 있습니다.
  • 쿼리 매개변수 추가: URL에 쿼리 매개변수를 추가할 수 있습니다.
  • 타임아웃 설정: 요청의 타임아웃을 설정할 수 있습니다.

6. 전체 예제

GET 요청을 통해 데이터를 받아와 화면에 표시하는 전체 예제입니다.

import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: HomePage(),
    );
  }
}

class HomePage extends StatefulWidget {
  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  String data = "Fetching data...";

  @override
  void initState() {
    super.initState();
    fetchData();
  }

  Future<void> fetchData() async {
    final response = await http.get(Uri.parse('https://jsonplaceholder.typicode.com/posts/1'));

    if (response.statusCode == 200) {
      setState(() {
        data = json.decode(response.body)['title'];
      });
    } else {
      setState(() {
        data = "Failed to load data";
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('HTTP GET Example')),
      body: Center(child: Text(data)),
    );
  }
}

이와 같은 방법으로 Flutter의 http 패키지를 사용하여 HTTP 요청을 보내고 데이터를 처리할 수 있습니다. 다양한 HTTP 요청과 에러 처리, JSON 데이터 파싱 등을 연습하여 더 복잡한 애플리케이션을 개발할 수 있습니다.


Leave a Reply

Your email address will not be published. Required fields are marked *