728x90

참고영상 : Como Programar uma API REST Simples em Golang Parte 6 - Responses # 23

 

더보기

main.go 수정

이전 내용에 추가 및 수정

* Response 구조체 추가

* Response 함수 추가

* REST 관련 함수 수정

package main

import ( ... )

type User struct { ... }

var users = []User{ ... }

// Response 구조체 선언
type Response struct {
	Method  string `json:"method`
	Message string `json:"message`
	Status  int    `json:"status`
}

// Response 데이터 전달을 위한 함수
func NewResponse(method, message string, status int) Response {
	return Response{Method: method, Message: message, Status: status}
}

func HttpInfo(r *http.Request) { ... }

// Content-Type을 "application/json"으로 설정하여 JSON 전달
func setJsonHeader(w http.ResponseWriter) {
	w.Header().Set("Content-Type", "application/json")
}

func main() {
	...
}

func getUsers(w http.ResponseWriter, r *http.Request) {
	...
}

// 특정 user 정보 전달
func getUser(w http.ResponseWriter, r *http.Request) {
	...

	// 수정
	//json.NewEncoder(w).Encode(&User{})
	json.NewEncoder(w).Encode(NewResponse(r.Method, "failed", 400))
}

// user 정보 추가
func postUser(w http.ResponseWriter, r *http.Request) {
	...

	if err != nil {
		//log.Fatal(err)
		// 수정
		json.NewEncoder(w).Encode(NewResponse(r.Method, "failed", 400))
		return
	}

	...

	// 수정
	//json.NewEncoder(w).Encode(users)
	json.NewEncoder(w).Encode(NewResponse(r.Method, "success", 201))
}

// user 정보 수정
func putUser(w http.ResponseWriter, r *http.Request) {
	...

	for index, _ := range users {
		if users[index].Id == id {
			users[index] = user
			// 수정
			//json.NewEncoder(w).Encode(user)
			json.NewEncoder(w).Encode(NewResponse(r.Method, "success", 200))
			return
		}
	}

	// 수정
	//json.NewEncoder(w).Encode(&User{})
	json.NewEncoder(w).Encode(NewResponse(r.Method, "failed", 400))
}

// user 정보 삭제
func deleteUser(w http.ResponseWriter, r *http.Request) {
	...

	for index, _ := range users {
		if users[index].Id == id {
			users = append(users[:index], users[index+1:]...)

			// 수정
			//json.NewEncoder(w).Encode(users)
			json.NewEncoder(w).Encode(NewResponse(r.Method, "success", 200))

			return
		}
	}

	// 수정
	//json.NewEncoder(w).Encode(&User{})
	json.NewEncoder(w).Encode(NewResponse(r.Method, "failed", 400))
}

 

 

REST에 대한 Respon요청 주소 URI를 인자로 받아 Response를 반환하는데, 사용자 임의로 내용(Message), 상태(Status)를 정의하여 전달할 수 있습니다.

728x90
Posted by 게으른거북
:
728x90

참고영상 : Como Programar uma API REST Simples em Golang Parte 5 # 22

 

더보기

main.go 수정

이전 내용에 추가 및 수정

* user 데이터 삭제(delete) 함수 추가
* 핸들러 로직 추가

package main

import (    
	...
)

type User struct { ... }

var users = []User{ ... }

func HttpInfo(r *http.Request) { ... }

func setJsonHeader(w http.ResponseWriter) { ... }

func main() {
	fmt.Println("Api Connected Port 3000....")

	r := mux.NewRouter().StrictSlash(true)

	r.HandleFunc("/users", getUsers).Methods("GET")
	r.HandleFunc("/users/{id}", getUser).Methods("GET")
	r.HandleFunc("/users", postUser).Methods("POST")
	r.HandleFunc("/users/{id}", putUser).Methods(("PUT"))
    
	// user 정보 삭제
	r.HandleFunc("/users/{id}", deleteUser).Methods(("DELETE"))

	log.Fatal(http.ListenAndServe(":3000", r))
}

func getUsers(w http.ResponseWriter, r *http.Request) {
	...
}

func getUser(w http.ResponseWriter, r *http.Request) {
	...
}

func postUser(w http.ResponseWriter, r *http.Request) {
	...
}

func putUser(w http.ResponseWriter, r *http.Request) {
	...
}

// 추가 : user 정보 삭제
func deleteUser(w http.ResponseWriter, r *http.Request) {

	setJsonHeader(w)

	HttpInfo(r)

	params := mux.Vars(r)

	id, _ := strconv.Atoi(params["id"])

	// id값이 일치하는 user 데이터 삭제
	for index, _ := range users {
		if users[index].Id == id {
			users = append(users[:index], users[index+1:]...)
			json.NewEncoder(w).Encode(users)
			fmt.Println(users)
			return
		}
	}

	json.NewEncoder(w).Encode(&User{})
}

 

users = append(users[:index], users[index+1:]...)

삭제하고자 하는 user 데이터의 index값을 if문으로 체크,

user[index]의 이전 데이터 배열과 user[index]의 이후의 user 데이터 배열을 결합(append).

 

 

Postman 을 통한 User 정보 삭제(DELETE 테스트) 결과 화면
728x90
Posted by 게으른거북
:
728x90

참고영상 : Como Programar uma API REST Simples em Golang Parte 4 # 21

 

더보기

main.go 수정

이전 내용에 추가 및 수정

* user 데이터 수정(put) 함수 추가
* 핸들러 로직 추가

package main

import (    
	...
)

type User struct { ... }

var users = []User{ ... }

func HttpInfo(r *http.Request) { ... }

func setJsonHeader(w http.ResponseWriter) { ... }

func main() {
	fmt.Println("Api Connected Port 3000....")

	r := mux.NewRouter().StrictSlash(true)

	r.HandleFunc("/users", getUsers).Methods("GET")
	r.HandleFunc("/users/{id}", getUser).Methods("GET")
	r.HandleFunc("/users", postUser).Methods("POST")
    
	// user 정보 수정
	r.HandleFunc("/users/{id}", putUser).Methods(("PUT"))

	log.Fatal(http.ListenAndServe(":3000", r))
}

func getUsers(w http.ResponseWriter, r *http.Request) {
	...
}

func getUser(w http.ResponseWriter, r *http.Request) {
	...
}

func postUser(w http.ResponseWriter, r *http.Request) {
	...
}

// 추가 : user 정보 수정
func putUser(w http.ResponseWriter, r *http.Request) {
	setJsonHeader(w)
	HttpInfo(r)

	params := mux.Vars(r)

	id, _ := strconv.Atoi(params["id"])

	body, _ := ioutil.ReadAll(r.Body)

	var user User

	err := json.Unmarshal(body, &user)

	if err != nil {
		log.Fatal(err)
	}

	for index, _ := range users {
		if users[index].Id == id {
			users[index] = user
			json.NewEncoder(w).Encode(user)
			return
		}
	}

	json.NewEncoder(w).Encode(&User{})
}

 

 

Postman 을 통한 User 정보 수정(PUT 테스트) 결과 화면
728x90
Posted by 게으른거북
:
728x90

참고영상 : Como Programar uma API REST Simples em Golang Parte 3 # 20

 

더보기

main.go 수정

이전 내용에 추가 및 수정.

* import 추가
* user 데이터 등록(post) 함수 추가
* 핸들러 로직 추가

package main

import (
	...
    
	"io/ioutil"
    
	...
)

type User struct { ... }

var users = []User{ ... }

func HttpInfo(r *http.Request) { ... }

func setJsonHeader(w http.ResponseWriter) { ... }

func main() {
	fmt.Println("Api Connected Port 3000....")

	r := mux.NewRouter().StrictSlash(true)

	r.HandleFunc("/users", getUsers).Methods("GET")
	r.HandleFunc("/users/{id}", getUser).Methods("GET")

	// user 데이터 추가
	r.HandleFunc("/users", postUser).Methods("POST")

	log.Fatal(http.ListenAndServe(":3000", r))
}

func getUsers(w http.ResponseWriter, r *http.Request) {
	...
}

func getUser(w http.ResponseWriter, r *http.Request) {
	...
}

// 추가 : user 정보 추가
func postUser(w http.ResponseWriter, r *http.Request) {
	setJsonHeader(w)
	HttpInfo(r)

	body, _ := ioutil.ReadAll(r.Body)

	var user User
	err := json.Unmarshal(body, &user)
    
	defer r.Body.Close()

	if err != nil {
		log.Fatal(err)
	}

	users = append(users, user)

	json.NewEncoder(w).Encode(users)
}

 

body, _ := ioutil.ReadAll(r.Body)

r.Body의 값에서 EOF를 만날 때까지 Read를 해주는 함수.

 

err := json.Unmarshal(body, &user)

json.Unmarshal는 바이트 슬라이스나 문자열을 논리적 자료 구조로 변경하는 함수.

첫 번째 파라미터에는 JSON 데이터(body)를, 두 번째 파라미터에는 출력할 구조체(user)를 포인터로 지정합니다.

리턴 값은 에러 객체이지만, 에러가 없을 경우, 두 번째 파라미터에 원래 데이터가 저장됩니다.

 

defer r.Body.Close()

r.Body를 사용한 이후에는 Close를 호출하여 닫아줘야 합니다.

 

확장 프로그램 다운 - Postman (링크)

REST 테스트를 위한 프로그램을 설치.

이를 통해 Golang server를 테스트할 수 있습니다.

 

크롬 웹 스토어 - Postman

 

Postman - Get 결과 화면

 

Postman - Post 과정 및 결과 화면
728x90
Posted by 게으른거북
:
728x90

참고영상 : Como Programar uma API REST Simples em Golang Parte 2 # 19

 

더보기

main.go 수정

이전 내용에 추가 및 수정.

* impoart 추가

* 서버에서 호출된 정보값 표시 함수 생성

* Header 전달 함수 생성

* 특정 user 정보 호출 함수 생성

* 핸들러 로직 추가

package main

import (
	...

	"fmt"     
	"strconv" 

	...
)

type User struct { ... }

var users = []User{ ... }

// 추가 : 호출된 정보값을 표시
func HttpInfo(r *http.Request) {
	fmt.Printf("%s\t %s\t %s\t %s\r\n", r.Method, r.Proto, r.Host, r.URL)
}

// 추가 : 별도 함수로 구분
func setJsonHeader(w http.ResponseWriter) {
	w.Header().Set("Content-Type", "application/json")
}

func main() {
	// main.go 실행시, 표시
	fmt.Println("Api Connected Port 3000....")

	r := mux.NewRouter().StrictSlash(true)

	// 핸들러 로직
	// user에 대한 데이터 전체 가져오기
	r.HandleFunc("/users", getUsers).Methods("GET")

	// 특정 user에 대한 데이터 가져오기
	r.HandleFunc("/users/{id}", getUser).Methods("GET")

	log.Fatal(http.ListenAndServe(":3000", r))
}

// 수정 : 전체 user 정보 전달
func getUsers(w http.ResponseWriter, r *http.Request) {
	setJsonHeader(w) //
	HttpInfo(r)      // 호출된 정보값을 표시

	json.NewEncoder(w).Encode(users)
}

// 추가 : 특정 user 정보 전달
func getUser(w http.ResponseWriter, r *http.Request) {
	setJsonHeader(w) //
	HttpInfo(r)      // 호출된 정보값을 표시

	// 파라미터값 체크
	params := mux.Vars(r)

	// 파라미터값 중 id값 추출
	id, _ := strconv.Atoi(params["id"])

	// 일치하는 user id를 확인
	for _, user := range users {
		if user.Id == id {
			// 일치하는 user의 데이터 표시 및 함수 종료
			json.NewEncoder(w).Encode(user)
			return
		}
	}

	// 일치하는 id가 없을 경우, blank 표시
	json.NewEncoder(w).Encode(&User{})
}

 

 

main.go 실행화면(cmd, web)
728x90
Posted by 게으른거북
: