Go 언어로 웹 사이트를 만들어 보세요(6: JSON에서 사용자 정보를 읽고 참조)

11301 단어 Goecho
모든 문장의 일람표는 여기에 있다.
Go 언어로 웹 사이트 만들기: 목록
http://qiita.com/y_ussie/items/8fcc3077274449478bc9
지난번 재개편http://qiita.com/y_ussie/items/12bb4fd8cefb740581f8의 계속이 되었다.
코드도 다 정리했으니까 계속 기능을 추가하고 싶어요.

하고 싶은 일


다음 단계로 삼다
  • JSON에서 사용자 정보를 읽고 참조할 수 있음
  • 로그인 화면에서 사용자 ID/비밀번호를 로그인할 수 있음
  • 로그인한 사용자만 볼 수 있는 페이지 만들기
  • 실현하고 싶어요.
    먼저 JSON에서 사용자 정보를 읽습니다.

    사용자 정보의 JSON 데이터


    그래서 다음과 같은 JSON 데이터를 만들어 봤습니다.
    data/users.json
    [
        {
            "id": "806d5832-e253-40ca-be80-a00878898c37",
            "user_id": "a-chan",
            "password": "5f4dcc3b5aa765d61d8327deb882cf99",
            "full_name": "Nishiwaki Ayaka"
        },
        {
            "id": "e7bdce91-c9bb-4a29-91f8-750ad4b18bfa",
            "user_id": "kashiyuka",
            "password": "5f4dcc3b5aa765d61d8327deb882cf99",
            "full_name": "Kashino Yuka"
        },
        {
            "id": "b87c826e-429b-4f50-aa35-b99f11a40b08",
            "user_id": "nocchi",
            "password": "5f4dcc3b5aa765d61d8327deb882cf99",
            "full_name": "Omoto Ayano"
        }
    ]
    
    필드는 id,user-id, password, full_네임입니다.
    id는 uidv4에서 생성된 유일한 값입니다.password는 MD5 산열 문자열을 사용합니다.
    이 JSON의 모델과 데이터 액세스기를 참고하는 세트는 다음과 같습니다.고로 변하다.
    JSON을 읽기 위한 모델 구성체는 다음과 같습니다.
    // User はユーザーの情報を表します。
    type User struct {
        ID       ID        `json:"id"`
        UserID   string    `json:"user_id"`
        Password StringMD5 `json:"password"`
        FullName string    `json:"full_name"`
    }
    
    // 情報をメモリ上に持つためのmap
    var users map[ID]User
    
    이 구조에서 다음 처리를 통해 JSON 데이터를 읽습니다.
    func (a *UserDataAccessor) decodeJSON() error {
        // JSONファイル読み込み
        bytes, err := ioutil.ReadFile("data/users.json")
        if err != nil {
            return err
        }
        // JSONをデコードする
        var records []User
        if err := json.Unmarshal(bytes, &records); err != nil {
            return err
        }
        // 結果をmapにセットする
        for _, x := range records {
            users[x.ID] = x
        }
        return nil
    }
    
    요청 처리 프로그램에서 읽은 JSON 데이터를 참조하기 위해 UserDataAccessor라는 구조체를 데이터 액세스기로 제작하였다.
    이것은 http://qiita.com/y_ussie/items/b1db86b0b54ec69bb928가 만든 세션 데이터 저장소와 마찬가지로 하나의 Goroutine를 통해 맵에 대한 접근 순서로 데이터 작업을 처리하고 외부에서Channel을 통해 접근한다.
    이번에는 읽기만 하기 때문에 이 정도까지 처리할 필요는 없지만, 당장 추가·업데이트·삭제 처리를 만들 예정이어서 고민 중이다.
    그러나 앞으로 데이터 모델이 증가함에 따라 과장해서 실시하는 것은 매우 어렵다. 그래서 다음에 데이터 모델을 증가할 때 모델의 공통된 처리를 한데 모아 각 모델의 실제 적재량을 줄이기 위해 팩스로 보내고 싶다.

    처리 측면 처리 요청


    이번에는 다음과 같은 요구 처리 절차를 추가한다.

    GET /users/:user_id


    :user id 경로 매개 변수를 사용하여 사용자 ID로 검색한 사용자 정보를 표시합니다.
    요청 처리 프로그램의 처리는 다음과 같다.
    // GET:/users/:id
    func handleUsersGet(c echo.Context) error {
        users, err := userDA.FindByUserID(c.Param("user_id"), model.FindFirst)
        if err != nil {
            return c.Render(http.StatusOK, "error", err)
        }
        user := users[0]
        return c.Render(http.StatusOK, "user", user)
    }
    
    templates/user.html
    {{define "content"}}
    <h2>User Detail</h2>
    <table>
    <tr>
    <th width="100px">User ID</th><td>{{.UserID}}</td>
    </tr>
    <tr>
    <th width="100px">Full Name</th><td>{{.FullName}}</td>
    </tr>
    </table>
    {{end}}
    
    
    경로 매개변수는 Echo에서 echo입니다.Context#Param(<매개 변수 이름>)에서 사용할 수 있습니다.
    검색을 위해 가져온 매개변수를 Data Accesser에서 준비한 FindByUserID()에 전달합니다.
    결과는 User 정렬로 반환됩니다.

    실행 결과


    GET /users/:user_id


    지정된 사용자 ID가 있으면 사용자 ID와 전체 이름이 표시됩니다.

    존재하지 않는 사용자 ID를 지정하면 오류가 표시됩니다.

    이번에 사용한 코드에 대해서.


    이번에 사용한 코드의 한 세트는 아래의 GiitHub에 놓여 있다.
    https://github.com/yoshinoyaussie/golang-website-sample/tree/chapter-6

    다음 계획


    다음은 이번에 제작된 사용자 정보 참조 메커니즘을 이용하여 로그인 화면과 로그인 사용자만 볼 수 있는 페이지를 제작한다.

    좋은 웹페이지 즐겨찾기