見出し画像

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)
}


この記事が気に入ったらサポートをしてみませんか?