Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

wintertreey 님의 블로그

AJax로 json 자료 받아 출력하기. 다국어 프로그램. open api. 본문

Vue

AJax로 json 자료 받아 출력하기. 다국어 프로그램. open api.

wintertreey 2024. 8. 7. 19:13

AJAX로 JSON 정보 출력하기

+ 다국어 프로그램

 

fetch 함수사용

10 더미파일

11 도서관 리스트 

13 고정위치 날씨

 

axios 함수 사용

12 도서관리스트

 

 


AJAX로 JSON 정보를 읽어오는 방법(fetch 함수 사용할 경우)

  1. fetch 함수 사용:
    • fetch는 JavaScript의 내장 함수로, HTTP 요청을 보내는 데 사용된다. 기본적으로 GET 요청을 보내며, URL을 매개변수로 받는다.
  2. 응답 처리:
    • fetch는 프로미스를 반환하므로 .then 메서드를 사용하여 응답을 처리할 수 있다. 첫 번째 .then에서 응답 객체를 받고, 응답의 ok 속성을 확인하여 요청이 성공적으로 처리되었는지 확인한다.
    • response.json() 메서드를 호출하여 응답 데이터를 JSON 형식으로 변환한다. 이 메서드 또한 프로미스를 반환하므로, 다음 .then에서 JSON 데이터를 사용할 수 있다.
  3. 데이터 사용:
    • JSON 데이터가 변환된 후, 필요한 부분을 추출하여 Vue 인스턴스의 data 속성에 저장한다. 예를 들어, json.slice(0, 10)을 사용하여 데이터의 일부만 선택하여 저장할 수 있다.
  4. 에러 처리:
    • .catch 메서드를 사용하여 네트워크 오류나 JSON 변환 오류 등을 처리한다. 에러 메시지를 콘솔에 출력하여 문제를 디버깅할 수 있다.

이러한 방식으로 비동기적으로 데이터를 요청하고 처리할 수 있으며, Vue.js와 같은 프레임워크와 결합하여 웹 애플리케이션을 동적으로 구성할 수 있다.

 


10 ajax로 json자료 받아 출력해보자. 더미데이터로 시도해본다.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="https://unpkg.com/vue@3"></script>
</head>
<body>
<div id="app">
    <button @click="fetchData">Ajax로 json자료 읽기</button>
    <button @click="clearData">json 자료 지우기</button>

    <div v-for="(post, index) in posts" :key="index">
        <h3>제목 : {{post.title}}</h3>
        <br>아이디 : {{post.id}}</br>
        <br>내용 : {{post.body}}</br>
        <hr/>
    </div>
</div>
<script>
    const {createApp} = Vue;

    createApp({
        data(){
            return{
                posts:[] // 초기 상태는 빈 배열
            }
        },
        methods: {
            fetchData(){
                // 'https://jsonplaceholder.typicode.com/posts' URL로 GET 요청을 보냄
                fetch('https://jsonplaceholder.typicode.com/posts')
                .then(response => {
                    // 응답의 상태를 확인. 상태가 OK가 아니면 에러 발생하는데, 이때 에러던지고 메세지뜨도록.
                    if(!response.ok){
                        throw new Error('ajax 에러');
                    }
                    return response.json(); // 응답을 JSON 형식으로 변환
                })
                .then(json => {
                    // JSON 데이터를 받아서 posts 배열의 앞 10개 항목만 저장
                    this.posts = json.slice(0, 10); //json의 데이터를 post배열에 담는다. 데이터의 일부만 받고자 slice
                })
                .catch(error => {
                    // 에러가 발생하면 콘솔에 에러 메시지를 출력
                    console.log('읽기 오류: ', error);
                });
            },
            clearData(){ // posts 배열을 빈 배열로 초기화하여 데이터 화면에서 제거
                this.posts = [];
            }
        },
    }).mount('#app');
</script>
</body>
</html>

 

 

출력결과

++ 추가

다국어 프로그램

<body>에 추가해준다

    <div class="gtranslate_wrapper">
        <script>window.gtranslateSettings = {"default_language":"ko","detect_browser_language":true,"languages":["es","de","th","mn","ar","ko","en","ja","zh-CN"],"wrapper_selector":".gtranslate_wrapper","flag_size":24,"horizontal_position":"right","vertical_position":"top"}</script>
        <script src="https://cdn.gtranslate.net/widgets/latest/flags.js" defer></script>
    </div>

독일어로 번역한결과

 

 


 

 

11 도서관 정보 출력해보기

 

json 정보. url주소는 이미지 설명에 첨부해둠.

https://raw.githubusercontent.com/pykwon/python/master/seoullibtime5.json

 

 

 

한국어버젼

 

독일어버젼 / 일본어버젼

 

 

 


12 fetch대신 axios로 json 출력해보자_ 똑같이 도서관자료

 

axios cdn 갖고오기

https://cdnjs.com/libraries/axios

method 부분 조금 수정

response부분을 좀더 간략하게 만들어주었다.

 

 

전체소스코드

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="https://unpkg.com/vue@3"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/axios/1.7.3/axios.min.js"></script>
</head>
<body>
    <div class="gtranslate_wrapper"> 
        <script>window.gtranslateSettings = {"default_language":"ko","detect_browser_language":true,"languages":["es","de","th","mn","ar","ko","en","ja","zh-CN"],"wrapper_selector":".gtranslate_wrapper","flag_size":24,"horizontal_position":"right","vertical_position":"top"}</script>
        <script src="https://cdn.gtranslate.net/widgets/latest/flags.js" defer></script>
    </div>
    <div id="app">
        <button @click="fetchData">도서관 자료 읽기</button>
        <button @click="clearData">자료 지우기</button>
    
        <div v-for="(lib, index) in libraries" :key="index">
            <h3>{{lib.LBRRY_NAME}}</h3>
            주소 : {{lib.ADRES}}<br>
            전화 : {{lib.TEL_NO}}<br>
            문닫는날 : {{lib.FDRM_CLOSE_DATE}}<br>
            <hr/>
        </div>
    </div>
    <script>
        const {createApp} = Vue;
    
        createApp({
            data(){
                return{
                    libraries:[]
                }
            },
            methods: {
                fetchData(){
                    axios.get('https://raw.githubusercontent.com/pykwon/python/master/seoullibtime5.json')
                    .then(response => { 
                        this.libraries = response.data.SeoulLibraryTime.row;
                    })
                    .catch(error => {
                        console.log('읽기 오류: ', error);
                    });
                },
                clearData(){
                    this.libraries = [];
                }
            },
        }).mount('#app');
    </script>    
</body>
</html>

 

출력결과

 


 

 

13 고정된 위치의 날씨 정보 출력해보기 - ajax를 사용

api를 얻을 수 있는 다양한 곳이 있다. 그 중 하나가 openweathermap.

https://cafe.daum.net/flowlife/HrhB/59

https://cafe.daum.net/flowlife/HqLj/33

해당 카페의 추천 사이트들을 참고하자.

 

 

전국 시군구 위도경도

https://blog.naver.com/kiakass/222449339999

 

해당위치의 위도경도

http://map.esran.com/

 

 

이번에 정보를 얻을 url

https://api.open-meteo.com/v1/forecast?latitude=37.51351448129256&longitude=127.10256814275422&current_weather=true

위도경도를 찍어주면 날씨를 알려준다.

 

전체 소스코드

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="https://unpkg.com/vue@3"></script>
</head>
<body>
<div id="app">
    <button @click="fetchWeather">우리 교실 날씨정보</button>
    <div v-if="weather">
        <h2>현재 날씨 정보</h2>
        <p>예보시간: {{weather.time}}</p>
        <p>온도: {{weather.temperature}}°C</p>
        <p>풍속: {{weather.windspeed}}km/h</p>
        <p>풍향: {{weather.winddirection}}°</p>

    </div>
</div>
<script>
    const {createApp} = Vue;

    createApp({
        data(){
            return{
                weather:null
            }
        },
        methods: {
            fetchWeather(){
                fetch('https://api.open-meteo.com/v1/forecast?latitude=37.4988&longitude=127.0317&current_weather=true')
                .then(
                    response => response.json()
                )
                .then(data => {
                    this.weather = data.current_weather;
                })
                .catch(error => {
                    console.log('날씨 자료 읽기 오류:', error)
                })
            }
        },
    }).mount('#app');
</script>
</body>
</html>

 

 

 

 


https://cafe.daum.net/flowlife/SBQ7/8

 

chapter 10 웹 문서 처리 : 실습 예제 url 주소 변경

실습 예제 중 일부의 url 주소를 변경합니다.서울시가 제공하던 '강남 소재 도서관 정보(5행 짜리)'가 폐쇄되어 부득이하게 주소를 변경합니다.326 페이지 : BeautifulSoup로 XML 문서 

cafe.daum.net

 

'Vue' 카테고리의 다른 글

RestFul하게 작업하기_ 반응형 데이터  (0) 2024.08.08
Ajax로 json 정보 출력하기_ cors 정책 위반 에러. Spring 연동  (0) 2024.08.07
구글차트 구현하기  (0) 2024.08.07
Vue 연습_ IIFE  (0) 2024.08.06
Vue 이벤트처리  (0) 2024.08.06