Golang 네트워크 요청

4561 단어

설명


본고는 주로 서버와 클라이언트로 나뉜다

서버


서버 감청 http 요청 유형은 주로 다음과 같은 몇 가지 방식으로 사용됩니다.
  • get의form 폼을 해석합니다
  • post를 해석하는 방식으로 json 대상을 해석한다
  • 해석은 폼의 방식으로postform 데이터를 해석한다

  • get의form 폼 분석

    func GetService(w http.ResponseWriter, r *http.Request)  {
        // get form 
        r.ParseForm()
        fmt.Println(r.Form["name"])
        fmt.Println(r.Form["sex"])
        fmt.Println(strings.Join(r.Form["name"], "-"))
        fmt.Println(strings.Join(r.Form["sex"], "-"))
        for k, v := range r.Form {
            fmt.Println(k, "=>", v, strings.Join(v, "-"))
        }
        // 
        fmt.Fprint(w, "It works")
    }
    

    post를 해석하는 방식으로 json 대상을 해석합니다.

    func PostService(w http.ResponseWriter, r *http.Request){
        // body
        body , err := ioutil.ReadAll(r.Body)
        if err != nil {
            fmt.Println("read fail")
            return
        }
        // body string
        bodyStr := string(body)
        fmt.Println("bodyStr", bodyStr)
        // , body struct
        var user User
        err1 := json.Unmarshal(body, &user)
        if err1 != nil{
            fmt.Println("unmarshal fail")
            return
        }
        fmt.Println("user", user.Name, user.Sex)
        // 
        fmt.Fprint(w, "Post is works")
    }
    

    폼으로postform 데이터 제출 분석

    func PostFormService(w http.ResponseWriter, r *http.Request) {
        // body 
        r.ParseForm()
        fmt.Println(r.Form["name"])
        fmt.Println(r.Form["sex"])
        fmt.Println(strings.Join(r.Form["name"], "-"))
        fmt.Println(strings.Join(r.Form["sex"], "-"))
        for k, v := range r.Form {
            fmt.Println(k, "=>", v, strings.Join(v, "-"))
        }
        // 
        fmt.Fprint(w, "Post is works")
    }
    

    서버가 사용하는 구조체
    type User struct {
        Name string `json:"name"`
        Sex string `json:"sex"`
    }
    

    서버를 여는 방법:
    http.HandleFunc("/get", GetService)
    http.HandleFunc("/post", PostService)
    http.HandleFunc("/postform", PostFormService)
    // 
    if err := http.ListenAndServe("127.0.0.1:8888", nil); err != nil {
        fmt.Println("service start err")
    }
    

    클라이언트


    클라이언트 요청 방식은 다음과 같습니다.
  • Get 요청을 시작합니다
  • 포스트 요청을 발기하다
  • PostForm 요청 시작

  • Get 요청 시작

    func GetTest()  {
        // url
        u, err := url.Parse("http://localhost:8888/get?")
        if err != nil {
            fmt.Println("url parse fail")
            return
        }
        q := u.Query()
        q.Set("name", "wnw")
        q.Set("sex", "wowam")
        u.RawQuery = q.Encode()
        // get 
        resp, err1 := http.Get(u.String())
        if err1 != nil || resp.StatusCode != http.StatusOK{
            fmt.Println("get fail:", err1)
            return
        }
        defer resp.Body.Close()
        // 
        body, err2 := ioutil.ReadAll(resp.Body)
        if err2 != nil {
            fmt.Println("read body fail")
            return
        }
        fmt.Println(string(body))
        // 
    }
    

    포스트 요청 시작

    func PostTest()  {
        u := "http://localhost:8888/post?"
        user := MyUser{" "," "}
        // 
        body, err := json.Marshal(user)
        if err != nil {
            fmt.Println("marshal fail")
            return
        }
        resp, err1 := http.Post(u, "application/x-www-form-urlencoded", strings.NewReader(string(body)))
        if err1 != nil {
            fmt.Println("post fail")
            return
        }
        // 
        defer resp.Body.Close()
        b, err2 := ioutil.ReadAll(resp.Body)
        if err2 != nil {
            fmt.Println("read body fail")
            return
        }
        fmt.Println(string(b))
    }
    

    PostForm 요청 시작

    func PostFormTest()  {
        // 
        u, err := url.Parse("http://localhost:8888/postform?")
        if err != nil {
            fmt.Println("parse is fail")
            return
        }
        q := u.Query()
        q.Set("name", " ")
        q.Set("sex", " ")
        // post 
        resp, err1 := http.PostForm(u.String(), q)
        if err1 != nil {
            fmt.Println("post fail")
            return
        }
        // 
        defer resp.Body.Close()
        body, err2 := ioutil.ReadAll(resp.Body)
        if err2 != nil{
            fmt.Println("body fail")
            return
        }
        fmt.Println(string(body))
    }
    

    좋은 웹페이지 즐겨찾기