Simple Web API Server in Golang (1)
2020-12-13 13:58
标签:style blog http color io os ar java for To be an better Gopher, get your hands dirty. Topcoder offered a serials of challenges for learning Golang. In this blog, I tried to implement "Go Learning Challenge - Simple Web-API Server"[1]. What‘s used in this challenge ? Following aspects and packages will be covered in this challenge Configuration File example: config.go tests for config.go After implementing this simple web api server, I got better understanding of Golang syntax and Web API stuffs. For more Web API server challenges, go to [3] about OAuth2. [1] topcoder : http://www.topcoder.com/challenge-details/30046011/?type=develop&noncache=true [2] git : https://coding.net/u/huys03/p/SimpleWebAPIServer/git [3] next challenge: http://www.topcoder.com/challenge-details/30046224/?type=develop Simple Web API Server in Golang (1) 标签:style blog http color io os ar java for 原文地址:http://www.cnblogs.com/huys03/p/4051264.html
[
{
"domain": "topcoder.com",
"users": [
{
"username": "takumi",
"password": "ilovego"
},
{
"username": "teru",
"password": "ilovejava"
},
{
"username": "toshi",
"password": "iloveapex"
}
]
},
{
"domain": "appirio.com",
"users": [
{
"username": "jun",
"password": "ilovetopcoder"
},
{
"username": "narinder",
"password": "ilovesamurai"
},
{
"username": "chris",
"password": "ilovesushi"
}
]
}
]
package SimpleWebAPIServer
import (
"io/ioutil"
"encoding/json"
"errors"
)
type User struct {
UserName string `json:"username"`
Password string `json:"password"`
}
type Domain struct {
Name string `json:"domain"`
Users UserList `json:"users"`
}
type DomainWarehouse []Domain
type UserList []User
func ReadConfig(fn string) (DomainWarehouse, error) {
data, err := ioutil.ReadFile(fn)
if err != nil {
return nil, err
}
//fmt.Println(string(data))
var m DomainWarehouse
json.Unmarshal(data, &m)
return m, nil
}
func (dw DomainWarehouse) GetDomain(name string) (*Domain, error) {
for _, domain := range dw {
if domain.Name == name {
return &domain, nil
}
}
return nil, errors.New("Failed to find domain")
}
func (ul UserList) GetUser(username string) (*User, error) {
for _, user := range ul {
if user.UserName == username {
return &user, nil
}
}
return nil, errors.New("Failed to find user")
}
package SimpleWebAPIServer
import (
"testing"
"fmt"
)
func TestReadConfig(t *testing.T) {
dw, err := ReadConfig("./users.json")
if err != nil {
fmt.Println(err)
t.Error("Failed to read config")
}
if dw == nil || len(dw) != 2 {
t.Error("Failed to unmarshal json objects")
}
if dw[0].Name != "topcoder.com" || len(dw[0].Users) != 3 {
t.Error("Incorrect value")
}
}
func TestGetDomain(t *testing.T) {
dw, err := ReadConfig("./users.json")
if err != nil {
fmt.Println(err)
t.Error("Failed to read config")
}
domain, err := dw.GetDomain("topcoder.com")
if err != nil {
fmt.Println(err)
t.Error("Failed to get domain")
}
if domain.Name != "topcoder.com" || len(domain.Users) != 3 {
t.Error("Incorrect value")
}
}
func TestGetUser(t *testing.T) {
dw, err := ReadConfig("./users.json")
if err != nil {
fmt.Println(err)
t.Error("Failed to read config")
}
domain, err := dw.GetDomain("topcoder.com")
if err != nil {
fmt.Println(err)
t.Error("Failed to get domain")
}
if domain.Name != "topcoder.com" || len(domain.Users) != 3 {
t.Error("Incorrect value")
}
ul := domain.Users
u, err := ul.GetUser("takumi")
if err != nil {
t.Error("Failed to get user")
}
if u.UserName != "takumi" || u.Password != "ilovego" {
t.Error("Invalid user values")
}
}
上一篇:c#中类和成员的修饰符介绍
下一篇:Java多行输入,行数未知
文章标题:Simple Web API Server in Golang (1)
文章链接:http://soscw.com/essay/33563.html