## ポイント
- [[url.Values]]を使って[[query]]を[[URLエンコード]]された文字列にする
- [[url.Values.Encode]]を使って[[map]]を[[query]]文字列に変換する
- [[http.Post]]を使ってPOSTする
- レスポンスの`StatusCode`でエラーハンドリングする
- レスポンスは[[Go言語でJSON変換|JSONからstructへ変換]]する
```go
type IClient interface {
PostHoge(id string, name string, uri string) (*response.Root, error)
}
type Client struct {
BaseUrl string
}
func NewClient(baseUrl string) IClient {
return Client{
BaseUrl: baseUrl,
}
}
func (c Client) PostHoge(id string, name string, uri string) (*response.Root, error) {
uri := c.createUri("/hoge", url.Values{
id: []string{id},
name: []string{name},
})
form := url.Values{
"uri": []string{uri},
}
body := strings.NewReader(form.Encode())
res, err := http.Post(uri, "application/json", body)
if err != nil {
// TODO: 例外処理
}
if res.StatusCode >= 500 {
// TODO: 例外処理
}
if res.StatusCode >= 400 {
// TODO: 例外処理
}
var r response.Root
if err := json.NewDecoder(res.Body).Decode(&r); err != nil {
// TODO: 例外処理
}
defer res.Body.Close()
return &r, nil
}
func (c Client) createUri(path string, query url.Values) string {
return fmt.Sprintf("%s%s?%s", c.BaseUrl, path, query.Encode())
}
```
## MOC
- [[Go言語でURLをパース]]