파 이 썬 파충류 + Go WebServer + Flutter App (GoLang 편)

28889 단어 Go
글 목록
  • 1. 머리말
  • 2. Go 개발 설치
  • 2.1 설치 Go
  • 2.2 GOPATH
  • 설정
  • 2.3 설치 개발 도구 LiteIDE
  • 3. 인터페이스 기능 개발
  • 3.1 포트 오픈 서비스 설정
  • 3.2 데이터베이스 에서 데 이 터 를 가 져 오고 클 라 이언 트 요청 에 응답 합 니 다
  • 3.2.1 데이터 구조 구축
  • 3.2.2 데이터베이스 만 들 기 작업
  • 3.2.3 클 라 이언 트 요청 에 응답
  • 4. 컴퓨터 외부 네트워크 를 설치 하면 접근 할 수 있다
  • 파 이 썬 편
    GitHub 프로젝트
    2. GoLang 편
    GitHub 프로젝트
    1. 머리말
    첫 번 째 Python 편 에 이 어 두 번 째 GoLang 편 입 니 다. Go 를 통 해 이 웹 서버 를 설정 합 니 다.
    2. Go 개발 설정
    서버 감청 을 설정 하고 클 라 이언 트 요청 을 기다 리 기;클 라 이언 트 요청 을 처리 하고 데이터 베 이 스 를 조회 하 며 반환 결 과 를 생 성하 여 클 라 이언 트 에 게 보 냅 니 다.
    2.1 설치 Go
    홈 페이지 에서 해당 시스템 의 패 키 지 를 다운로드 하여 설치 가 완료 되 었 습 니 다. 환경 변 수 를 설정 하여 "go version" 을 입력 하고 해당 하 는 go 버 전 을 표시 하면 설치 가 완료 되 었 습 니 다.
    zxl@zxl:~$ go version
    go version go1.12 linux/amd64
    

    2.2 GOPATH 설정
    go 작업 공간 루트 디 렉 터 리 를 새로 만 들 고 이 디 렉 터 리 를 GOPATH 로 설정 합 니 다. Liux 를 예 로 들 면
    export GOPATH=/home/zxl/workspace/my_github/go_test_server
    

    2.3 설치 개발 도구 LiteIDE
    다운로드 링크 를 통 해 최신 버 전 을 선택 하고 해당 시스템 의 설치 패 키 지 를 다운로드 하여 LitelDE 를 열 고 메뉴 "도구" - > "현재 환경 편집" 을 선택 하여 GOROOT, GOPATH, PATH 를 설정 합 니 다.
    GOROOT=/usr/local/go
    GOPATH=/home/zxl/workspace/my_github/go_test_server
    PATH=$GOROOT/bin:$PATH
    

    메뉴 "도구" - > "GOPATH / Modules 관리" 를 선택 하여 모든 작업 컨트롤 의 GOPATH 를 설정 할 수 있 습 니 다.
    3. 인터페이스 기능 개발
    인터페이스 주요 응답 클 라 이언 트 데이터 요청
    3.1 포트 오픈 서비스 설정
    다음 코드 에서 보 듯 이 포트 가 "9090" 인 서 비 스 를 설정 하고 메뉴 "컴 파일" - > "BuildAndRun" 을 클릭 하면 서 비 스 를 시작 하여 브 라 우 저 에 입력 할 수 있 습 니 다. "http://localhost:9090/test", 웹 페이지 는" Hello astaxie! "
    package main
    
    import (
    	"fmt"
    	"log"
    	"net/http"
    	"strings"
    
    	http_handle "http_handle"
    )
    
    func sayhelloName(w http.ResponseWriter, r *http.Request) {
    	r.ParseForm()       //    ,        
    	fmt.Println(r.Form) //                 
    	fmt.Println("path", r.URL.Path)
    	fmt.Println("scheme", r.URL.Scheme)
    	fmt.Println(r.Form["url_long"])
    	for k, v := range r.Form {
    		fmt.Println("key:", k)
    		fmt.Println("val:", strings.Join(v, ""))
    	}
    	fmt.Fprintf(w, "Hello astaxie!") //     w         
    }
    
    func main() {
    	http.HandleFunc("/test", sayhelloName) //       
    	err := http.ListenAndServe(":9090", nil) //       
    	if err != nil {
    		log.Fatal("ListenAndServe: ", err)
    	}
    }
    

    3.2 데이터베이스 에서 데 이 터 를 가 져 오고 클 라 이언 트 요청 에 응답 합 니 다.
    3.2.1 데이터 구조 만 들 기
    package data
    
    type QsbkHotPicItem struct {
    	Id                    string
    	AuthorNickName        string
    	AuthorGender          string
    	AuthorAge             string
    	AuthorImgUrl          string
    	Content               string
    	ThumbImgUrl           string
    	StatsVoteContent      string
    	StatsCommentContent   string
    	StatsCommentDetailUrl string
    	Md5                   string
    }
    type QsbkHotPicItemList struct {
    	ItemList []QsbkHotPicItem
    }
    
    

    3.2.2 데이터베이스 생 성 작업
    package base_db
    
    import (
    	"database/sql"
    	"fmt"
    
    	_ "github.com/Go-SQL-Driver/MySQL"
    )
    
    func Query(sql_str string) (*sql.Rows, *sql.Stmt, *sql.DB) {
    	fmt.Println("query::sql_str = ", sql_str)
    	db, _ := sql.Open("mysql", "   :  @tcp(zxltest.zicp.vip:42278)/joke")
    	fmt.Println("query::open_db_err = ", open_db_err)
    	stmt, prepare_err := db.Prepare(sql_str)
    	fmt.Println("query::prepare_err = ", prepare_err)
    	rows, query_err := stmt.Query()
    	fmt.Println("query::query_err = ", query_err)
    
    	return rows, stmt, db
    }
    

    3.2.3 클 라 이언 트 요청 에 응답
    MySQL 의 경우 명령 행 단말기 에 데이터 베 이 스 를 가 져 오고 입력 go get -u github.com/go-sql-driver/mysql 익명 가 져 오기 패키지 _ "github.com/Go-SQL-Driver/MySQL" 가 져 오기 데이터 재 구성 "data" 가 져 오기 데이터베이스 작업 base_db "db" 이 자동 으로 드라이버 라 이브 러 리 를 다운로드 하여 설 정 된 GOPATH 디 렉 터 리 에 넣 으 면 코드 개발 이 완 료 됩 니 다. 마지막 으로 json 형식 으로 데 이 터 를 클 라 이언 트 에 되 돌려 줍 니 다.
    package http_handle
    
    import (
    	"encoding/json"
    	"fmt"
    	"net/http"
    	"strconv"
    	"strings"
    
    	_ "github.com/Go-SQL-Driver/MySQL"
    
    	"data"
    	base_db "db"
    )
    
    func QsbkHotPicList(w http.ResponseWriter, r *http.Request) {
    	r.ParseForm()       //    ,        
    	fmt.Println(r.Form) //                 
    	fmt.Println("path", r.URL.Path)
    	fmt.Println("scheme", r.URL.Scheme)
    
    	var last_id = -1
    	if len(r.Form["last_id"]) > 0 {
    		last_id, _ = strconv.Atoi(r.Form["last_id"][0])
    	}
    	page, _ := strconv.Atoi(r.Form["page"][0])
    	page_size, _ := strconv.Atoi(r.Form["page_size"][0])
    	fmt.Println("last_id", last_id)
    	fmt.Println("page", page)
    	fmt.Println("page_size", page_size)
    
    	var start_index = page * page_size
    	var end_index = page_size
    	fmt.Println("start_index", start_index)
    	fmt.Println("end_index", end_index)
    
    	for k, v := range r.Form {
    		fmt.Println("key:", k)
    		fmt.Println("val:", strings.Join(v, ""))
    	}
    
    	var sql_where = ""
    	if last_id > 0 {
    		start_index = 0
    		end_index = 10
    		sql_where = " WHERE id < " + strconv.Itoa(last_id) + " "
    	}
    	fmt.Println("sql_where", sql_where)
    
    	var sql_str = "SELECT " +
    		"id, author_nick_name,author_gender,author_age,author_img_url,content,thumb_img_url,stats_vote_content,stats_comment_content,stats_comment_detail_url,md5 " +
    		"FROM joke " + sql_where +
    		"ORDER BY id DESC LIMIT " + strconv.Itoa(start_index) + "," + strconv.Itoa(end_index)
    
    	rows, stmt, db := base_db.Query(sql_str)
    
    	var qsbkHotPicItemList data.QsbkHotPicItemList
    	for rows.Next() {
    		var id, author_nick_name, author_gender, author_age, author_img_url, content, thumb_img_url, stats_vote_content, stats_comment_content, stats_comment_detail_url, md5 string
    		rows.Scan(&id, &author_nick_name, &author_gender, &author_age, &author_img_url, &content, &thumb_img_url, &stats_vote_content, &stats_comment_content, &stats_comment_detail_url, &md5)
    		fmt.Println("query::result = ", id, author_nick_name, author_gender, author_age, author_img_url, content, thumb_img_url, stats_vote_content, stats_comment_content, stats_comment_detail_url, md5)
    
    		var item = data.QsbkHotPicItem{id, author_nick_name, author_gender, author_age, author_img_url, content, thumb_img_url, stats_vote_content, stats_comment_content, stats_comment_detail_url, md5}
    		qsbkHotPicItemList.ItemList = append(qsbkHotPicItemList.ItemList, item)
    	}
    	defer rows.Close()
    	defer stmt.Close()
    	defer db.Close()
    
    	responseResult, responseError := json.Marshal(qsbkHotPicItemList)
    	fmt.Println("query::responseError = ", responseError)
    	fmt.Println("query::responseResult = ", string(responseResult))
    	fmt.Fprint(w, string(responseResult))
    }
    

    4. 컴퓨터 외부 네트워크 를 설치 하여 접근 가능
    우리 의 현재 디 버 깅 은 모두 로 컬 랜 드 네트워크 이기 때문에 다른 사람 은 우리 의 서 비 스 를 방문 할 수 없 기 때문에 우 리 는 외부 네트워크 기능 을 제공 해 야 한다. 즉, 내부 네트워크 관통 은 땅콩 껍질 강 좌 를 통 해 내부 네트워크 관통 설정 을 완성 할 수 있다.
    마지막 으로 우리 의 포트 를 '9090' 의 서비스 로 시작 하고 땅콩 껍질 내부 망 관통 설정 을 켜 면 외부 망 기능 을 제공 할 수 있 습 니 다.

    좋은 웹페이지 즐겨찾기