Go -⑧基本-
◼︎http
◼︎出力
一部出力は省略
http://example.com/te/tee/teeee /test?a=1&b=2 http://example.com/test?a=1&b=2
map[a:[1] b:[2] c:[3] d:[4&%]]
a=1&b=2&c=3&d=4%26%25
---------------------
https://example.com/te/tee/teeee /test?a=1&b=2 https://example.com/test?a=1&b=2
map[a:[1] b:[2] c:[3] d:[4&%]]
a=1&b=2&c=3&d=4%26%25
◼︎コード
package main
import (
"bytes"
"fmt"
"io/ioutil"
"net/http"
"net/url"
)
func sample() string {
resp, _ := http.Get("http://example.com")
defer resp.Body.Close()
body, _ := ioutil.ReadAll(resp.Body)
return string(body)
}
func sampleGet() string {
// urlの作成
base,_ := url.Parse("http://example.com/te/tee/teeee")
reference, _ := url.Parse("/test?a=1&b=2")
endPoint := base.ResolveReference(reference).String()
fmt.Println(base,reference,endPoint)
// リクエスト作成
req, _ := http.NewRequest("GET", endPoint, nil)
req.Header.Add("If-None","w/wtest")
// query追加
q := req.URL.Query()
q.Add("c","3")
q.Add("d","4&%")
fmt.Println(q)
fmt.Println(q.Encode())
req.URL.RawQuery = q.Encode()
// 通信
var client *http.Client = &http.Client{}
resp, _ := client.Do(req)
body, _ := ioutil.ReadAll(resp.Body)
return string(body)
}
func samplePost() string {
// urlの作成
base,_ := url.Parse("https://example.com/te/tee/teeee")
reference, _ := url.Parse("/test?a=1&b=2")
endPoint := base.ResolveReference(reference).String()
fmt.Println(base,reference,endPoint)
// リクエスト作成
req, _ := http.NewRequest("POST", endPoint, bytes.NewBuffer([]byte("password")))
req.Header.Add("If-None","w/wtest")
// query追加
q := req.URL.Query()
q.Add("c","3")
q.Add("d","4&%")
fmt.Println(q)
fmt.Println(q.Encode())
req.URL.RawQuery = q.Encode()
// 通信
var client *http.Client = &http.Client{}
resp, _ := client.Do(req)
body, _ := ioutil.ReadAll(resp.Body)
return string(body)
}
func main() {
stringBody := sample()
fmt.Println(stringBody)
fmt.Println("---------------------")
stringBodyGet := sampleGet()
fmt.Println(stringBodyGet)
fmt.Println("---------------------")
stringBodyPost := samplePost()
fmt.Println(stringBodyPost)
}
◼︎ json.UnmarshalとMarshalとエンコード
◼︎出力
json.Unmarshal {TOM 20 [] <nil>} TOM 20 []
json.marshal {"Name":"Mr.TOM"}
◼︎コード
package main
import (
"encoding/json"
"fmt"
)
type T struct {}
// json:"名前"でjson時の名前を記載できる
// omitemptyを利用することで、からの場合は表示しなくなる
type Person struct{
Name string `json:"name"`
Age int `json:"age,omitempty"`
Nicknames []string `json:"nicknames,omitempty"`
T *T `json:"T,omitempty"`
}
// unmershalJSONをオーバライド
func (p *Person) unmershalJSON(b []byte) error{
type Person2 struct{
Name string
}
var p2 Person2
err := json.Unmarshal(b, &p2)
if err != nil{
fmt.Println(err)
}
p.Name = p2.Name + "!"
return err
}
// MershalJSONをオーバライド
func (p Person) MarshalJSON() ([]byte, error){
v, err := json.Marshal(&struct {
Name string
}{
Name:"Mr."+p.Name,
})
return v, err
}
func main() {
b:= []byte(`{"name":"TOM","age":20,"nicknames":[]}`)
var p Person
if err := json.Unmarshal(b, &p); err != nil{
fmt.Println(err)
}
fmt.Println("json.Unmarshal",p,p.Name,p.Age,p.Nicknames)
v,_ := json.Marshal(p)
fmt.Println("json.marshal",string(v))
}
◼︎hmacでAPI認証
◼︎出力
076b55e7f7e12624b4569f162302f1e36c11fb3a9134889267748de14a84b996
true
------------------------------
5165511b8230bd1cfbe3989cc256213819126b3394c35d14e3cd7e4f90fe443c
false
◼︎コード
package main
import (
"crypto/hmac"
"crypto/sha256"
"encoding/hex"
"fmt"
)
var DB = map[string]string{
"User1key": "User1Secret",
"User2key": "User2Secret",
}
func Server(apiKey, sign string, data []byte) {
apiSecret := DB[apiKey]
h := hmac.New(sha256.New, []byte(apiSecret))
h.Write(data)
expectedHMAC := hex.EncodeToString(h.Sum(nil))
fmt.Println(sign == expectedHMAC)
}
func mkSign(apiSecret string) ([]byte, string) {
data := []byte("data")
h := hmac.New(sha256.New, []byte(apiSecret))
h.Write(data)
sign := hex.EncodeToString(h.Sum(nil))
fmt.Println(sign)
return data, sign
}
func main() {
// 一致例
const apikey = "User1key"
const apiSecret = "User1Secret"
data, sign := mkSign(apiSecret)
Server(apikey, sign, data)
fmt.Println("------------------------------")
// 不一致例
const apikey2 = "key"
const apiSecret2 = "Secret"
data2, sign2 := mkSign(apiSecret2)
Server(apikey2, sign2, data2)
}
この記事が気に入ったらサポートをしてみませんか?