15일차 과제 - rlatkddbs99/Flutter GitHub Wiki

1.HTTP 통신시 status code가 무엇인지 200, 400, 404, 500, 503, 301, 303를 중점으로 정리하시오

웹서비스에서 반환되는 상태 코드를 HTTP STATUS CODE라 한다. 상태 코드는 3자리 숫자로 만들어져 있으며, 첫번째 자리는 1에서 5까지 제공

1XX : Information responses 상태 코드가 '1'로 시작하는 경우는 서버가 요청을 받았으며, 서버에 연결된 클라이언트는 작업을 계속 진행

100 Continue : 진행 중임을 의미하는 응답코드입니다. 현재까지의 진행상태에 문제가 없음 101 Switching Protocol : 클라이언트에 의해 보낸 업그레이드 요청 헤더에 대한 응답 102 Processing(WebDAV): 서버가 요청을 수신하였으며 이를 처리하고 있지만, 아직 제대로 된 응답을 알려줄 수 없음

2XX : Successful responses 200 OK : 요청이 성공적으로 되었습니다. 정보는 요청에 따른 응답으로 반환 201 Created :요청이 성공적이었으며 그 결과로 새로운 리소스가 생성 202 Accepted, 203 Non-Authoritative Information, 204 No Content, 205 Reset Content, 206 Partial Content, 207 Multi-Status, 208 Already Reported, 226 IM Used

3XX : Redirection messages 300 Multiple Choice : 요청에 대해서 하나 이상의 응답이 가능 301 Moved Permanently : 요청한 리소스의 URI가 변경되었음을 의미합니다. 새로운 URI가 응답에서 아마도 주어질 수 있습니다. 302 Found : 요청한 리소스의 URI가 일시적으로 변경되었음을 의미 303 See Other : 클라이언트가 요청한 리소스를 다른 URI에서 GET 요청을 통해 얻어야 할 때, 서버가 클라이언트로 직접 보내는 응답 304 Not Modified : 캐시를 목적으로 사용됩니다. 클라이언트에게 응답이 수정되지 않았음을 알려주며, 클라이언트는 계속해서 응답의 캐시된 버전을 사용할 수 있습니다. 등등 ...

4XX : Client error responses 400 Bad Request : 잘못된 문법으로 인하여 서버가 요청하여 이해할 수 없음을 의미 404 Not Found : 서버는 요청받은 리소스를 찾을 수 없습니다. 브라우저에서는 알려지지 않은 URL을 의미합니다. 이것은 API에서 종점은 적절하지만 리소스 자체는 존재하지 않음을 의미할 수 있습니다. 등등 ...

5XX : Server error responses 500 Internal Server Error : 웹 사이트 서버에 문제가 있음을 의미하지만 서버는 정확한 문제에 대해 더 구체적으로 설명할 수 없습니다 502 Bad Gateway : 서버가 게이트웨이로부터 잘못된 응답을 수신했음을 의미 503 Service Unavailable : 서버가 요청을 처리할 준비가 되지 않았습니다. 일반적인 원인은 유지보수를 위해 작동이 중단되거나 과부하가 걸린 서버입니다

캡처

http dio

import 'dart:convert';
import 'dart:math';

import 'package:dio/dio.dart';
import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  void getData() async {
    var url = "https://sniperfactory.com/sfac/http_";
    var dio = Dio();

    for (var i = 20; i <= 50; i++) {
      await dio
          .get(url + i.toString())
          .then((value) => print("$value"))
          .catchError((e) {
        print(e);
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Center(
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.center,
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              TextButton(onPressed: () => getData(), child: Text("url 찾기"))
            ],
          ),
        ),
      ),
    );
  }

  handleError() {
    print("오류 입니다!");
  }
}

  1. 캡처1

option 설정

import 'dart:convert';
import 'dart:math';

import 'package:dio/dio.dart';
import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  void getData() async {
    var url = "https://sniperfactory.com/sfac/http_assignment_";
    var dio = Dio();

    for (var i = 100; i <= 150; i++) {
      await dio
          .post(url + i.toString(),
              options: Options(headers: {
                "user-agent": "SniperFactoryBrowser",
                'authorization': 'Bearer 123',
              }))
          .then((value) => print("$value"))
          .catchError((e) {
        print(e);
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Center(
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.center,
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              TextButton(onPressed: () => getData(), child: Text("url 찾기"))
            ],
          ),
        ),
      ),
    );
  }

  handleError() {
    print("오류 입니다!");
  }
}

캡처2

일단 먼저 리스트 형태 확인

import 'dart:convert';
import 'dart:math';

import 'package:dio/dio.dart';
import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  void getData() async {
    var url = "https://sniperfactory.com/sfac/http_json_data";
    var dio = Dio();
    var res = await dio.get(url);
    print(res.data);
    return res.data;
  }

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
          body: TextButton(
              onPressed: () {
                getData();
              },
              child: Text("실행"))),
    );
  }

  handleError() {
    print("오류 입니다!");
  }
}

캡처3

main.dart

import 'dart:convert';
import 'dart:math';

import 'package:dio/dio.dart';
import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  Future<Map<String, dynamic>> getData() async {
    var url = "https://sniperfactory.com/sfac/http_json_data";
    var dio = Dio();
    var res = await dio.get(url);
    print(res.data); //데이터 확인
    return res.data;
  }

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
          body: FutureBuilder(
              future: getData(),
              builder: ((context, snapshot) {
                if (snapshot.connectionState == ConnectionState.done) {
                  return Card(
                    margin: EdgeInsets.all(50),
                    shape: RoundedRectangleBorder(
                        side: BorderSide(
                          color: Colors.grey,
                        ),
                        borderRadius: BorderRadius.circular(16)),
                    clipBehavior: Clip.none,
                    child: Column(
                      crossAxisAlignment: CrossAxisAlignment.center,
                      mainAxisAlignment: MainAxisAlignment.center,
                      children: [
                        Expanded(
                          child: Image(
                              fit: BoxFit.fill,
                              image: NetworkImage(
                                  snapshot.data!['item']['image'] ?? "오류")),
                        ),
                        Text(snapshot.data!['item']['name']),
                        SizedBox(
                          height: 3,
                        ),
                        Text(snapshot.data!['item']['description']),
                        SizedBox(
                          height: 15,
                        ),
                        ElevatedButton(
                            onPressed: () {},
                            child: Text(
                                snapshot.data!['item']['price'].toString() +
                                    '원 결제하고 등록'))
                      ],
                    ),
                  );
                }
                return Text("오류");
              }))),
    );
  }

  handleError() {
    print("오류 입니다!");
  }
}

캡처4

import 'dart:convert';
import 'dart:math';

import 'package:dio/dio.dart';
import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  Future getData() async {
    var url = "https://jsonplaceholder.typicode.com/photos?albumId=1";
    var dio = Dio();
    var res = await dio.get(url);
    print(res.data);
    return res.data;
  }

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
          body: FutureBuilder(
              future: getData(),
              builder: ((context, snapshot) {
                if (snapshot.connectionState == ConnectionState.done) {
                  return ListView.builder(
                      itemCount: snapshot.data!.length,
                      itemBuilder: ((context, index) {
                        return Card(
                          clipBehavior: Clip.antiAlias,
                          child: Column(
                            crossAxisAlignment: CrossAxisAlignment.start,
                            children: [
                              Image(
                                  image: NetworkImage(
                                      snapshot.data![index]['url'])),
                              Text(snapshot.data![index]['title'])
                            ],
                          ),
                        );
                      }));
                }
                return Text("오류");
              }))),
    );
  }

  handleError() {
    print("오류 입니다!");
  }
}
⚠️ **GitHub.com Fallback** ⚠️