Flutter/Concept

[ Flutter ] HTTP ํ†ต์‹ 

Design-loving front-end engineer 2022. 1. 28. 10:45

POST

๐Ÿ’ฌ  ์„œ๋ฒ„์— ์š”๊ตฌํ•˜๋Š” ํฌ๋งท์— ๋งž์ถฐ ์„œ๋ฒ„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๊ณ , ๋•Œ์— ๋”ฐ๋ผ ์„œ๋ฒ„์—์„œ ํšŒ์‹ ํ•˜๋Š” Response๋ฅผ ๋ฐ›๋Š” ์ž‘์—…

์˜ˆ์ œ

๐Ÿ’ฌ  ๋‘ ๊ฐœ์˜ ์ž…๋ ฅ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” TextField

๐Ÿ’ฌ  ๊ฐ’์„ ์ž…๋ ฅ ํ›„ FloatingButton์„ ํด๋ฆญ ์‹œ ์›น ์„œ๋ฒ„์— ์ž…๋ ฅํ•œ ๊ฐ’์„ ์ง€์ •ํ•œ ํฌ๋งท์œผ๋กœ post ํ›„ response๋ฅผ ๋ฐ›์•„์„œ ํ™”๋ฉด์— ๋„์›Œ์ค€๋‹ค.

๋ชจ๋ธ ํด๋ž˜์Šค ๋งŒ๋“ค๊ธฐ

https://app.quicktype.io/

 

Instantly parse JSON in any language | quicktype

 

app.quicktype.io

๐Ÿ’ฌ  response๋กœ ๋ฐ›์„ Json ๋ฐ์ดํ„ฐ์˜ ํฌ๋งท์— ๋งž๋Š” ์˜ˆ์‹œ ๋ฐ์ดํ„ฐ๋ฅผ ํ™”๋ฉด ์™ผํŽธ์— ์ ์œผ๋ฉด ์˜ค๋ฅธํŽธ์— Json์—์„œ String๊นŒ์ง€์˜ ์ธ์ฝ”๋“œ, ๋””์ฝ”๋“œ ์ฝ”๋“œ๊ฐ€ ํฌํ•จ๋œ ํด๋ž˜์Šค๊ฐ€ ๋งŒ๋“ค์–ด์ง€๋ฉฐ, ์ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋ธ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ ๋‹ค.

 

์ฝ”๋“œ ์ž‘์„ฑํ•˜๊ธฐ

main.dart

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

class MyApp extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

Future<UserModel> createUser(String name, String jobTitle) async {
  const String apiUrl = "https://reqres.in/api/users";

  // post๋ฅผ ๋ณด๋‚ด๊ณ  await๋กœ response๋ฅผ ๋ฐ›์•„์˜จ ๊ฒƒ์„ response์— ๋„ฃ๋Š”๋‹ค.
  final response = await http.post(apiUrl, body: {
    "name": name,
    "job": jobTitle
  });

  if (response.statusCode == 201) {
    final String responseString = response.body;
    return userModelFromJson(responseString);
  } else {
    return throw Exception('Error');
  }
}

class _MyHomePageState extends State<MyHomePage> {

  late UserModel _user = UserModel(name: "", job: "", id: "", createdAt: DateTime.now());

  final TextEditingController nameController = TextEditingController();
  final TextEditingController jobController = TextEditingController();

  @override
  Widget build(BuildContext context) {

    return Scaffold(
      appBar: AppBar(
        title: const Text('HTTP Test'),
      ),
      body:Container(
        padding: const EdgeInsets.all(32),
        child: Column(
          children: <Widget>[
            TextField(
              controller: nameController,
            ),
            TextField(
              controller: jobController,
            ),
            const SizedBox(height: 32,),
            Text(
              "User Name : ${_user.name}\n"
              "User Job : ${_user.job}\n"
              "User Id : ${_user.id}\n"
              "Create Time : ${_user.createdAt.toIso8601String()}"
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () async {
          final String name = nameController.text;
          final String jobTitle = jobController.text;
          final UserModel user = await createUser(name, jobTitle);

          setState(() {
            _user = user;
          });
        },
        tooltip: 'Increment',
        child: const Icon(Icons.add),
      ), // This trailing comma makes auto-formatting nicer for build methods.
    );
  }
}

 

์ถ”๊ฐ€ ์ง€์‹

response code

200 (์„ฑ๊ณต) : ์„œ๋ฒ„๊ฐ€ ์š”์ฒญ์„ ์ œ๋Œ€๋กœ ์ฒ˜๋ฆฌํ–ˆ๋‹ค๋Š” ์˜๋ฏธ. ์ฃผ๋กœ ์„œ๋ฒ„๊ฐ€ ์š”์ฒญ๋ฐ›์€ ํŽ˜์ด์ง€๋ฅผ ์ œ๊ณตํ–ˆ๋‹ค๋Š” ์˜๋ฏธ๋กœ ์“ฐ์ธ๋‹ค.

201 (์ž‘์„ฑ๋จ) : ์„ฑ๊ณต์ ์œผ๋กœ ์š”์ฒญ๋˜์—ˆ์œผ๋ฉฐ, ์„œ๋ฒ„๊ฐ€ ์ƒˆ ๋ฆฌ์†Œ์Šค๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค๋Š” ์˜๋ฏธ๋กœ ์“ฐ์ธ๋‹ค.