gokit HTTP client/server 实例示例教程详解原创

gokit HTTP client/server 实例示例教程详解原创

服务端

package main

import (
	"context"
	"encoding/json"
	"fmt"
	"net/http"

	"github.com/go-kit/kit/endpoint"

	httptransport "github.com/go-kit/kit/transport/http"
)

type xiaoquServiceInter interface {
	fangke(string) string
	query(string) int
}

type xiaoquService struct{}

type fangkeReq struct {
	Name string `json:"name"`
}

type fangkeRsp struct {
	Result string `json:"result"`
}

type queryReq struct {
	Name string `json:"name"`
}

type queryRsp struct {
	Num int `json:"num"`
}

func (xiaoquService) fangke(fangke string) string {
	fmt.Println("fangke:", fangke)
	return "come in"
}

func (xiaoquService) query(author string) int {
	fmt.Println("author ", author, " query.")
	return 100
}

//---------endpoint--------------------
func makeFangkeEndpoint(svr xiaoquServiceInter) endpoint.Endpoint {
	return func(ctx context.Context, request interface{}) (interface{}, error) {
		req := request.(fangkeReq)
		fmt.Println("req:", req)
		s := svr.fangke(req.Name)
		return fangkeRsp{s}, nil
	}
}

func makeQueryEndpoint(svr xiaoquServiceInter) endpoint.Endpoint {
	return func(ctx context.Context, request interface{}) (interface{}, error) {
		req := request.(queryReq)
		rsp := svr.query(req.Name)
		return queryRsp{rsp}, nil
	}
}

//---------transport------------------
func decodeFangkeRequest(ctx context.Context, r *http.Request) (interface{}, error) {
	var request fangkeReq
	if err := json.NewDecoder(r.Body).Decode(&request); err != nil {
		fmt.Println("decodeFangkeRequest decode err:", err)
		return nil, err
	}
	return request, nil
}

func decodeQueryRequest(ctx context.Context, r *http.Request) (interface{}, error) {
	request := queryReq{}
	if err := json.NewDecoder(r.Body).Decode(&request); err != nil {
		fmt.Println("decodeFangkeRequest decode err:", err)
		return nil, err
	}
	return request, nil
}

func encodeRsp(ctx context.Context, w http.ResponseWriter, response interface{}) error {
	return json.NewEncoder(w).Encode(&response)
}

// -------------------------------------------------------

func main() {
	svr := xiaoquService{}
	fangkeHandle := httptransport.NewServer(makeFangkeEndpoint(svr),
		decodeFangkeRequest,
		encodeRsp)
	queryHandle := httptransport.NewServer(makeQueryEndpoint(svr),
		decodeQueryRequest,
		encodeRsp)

	http.Handle("/fangke", fangkeHandle)
	http.Handle("/query", queryHandle)
	fmt.Println(http.ListenAndServe(":8000", nil))
	return
}

客户端

package main

import (
	"bytes"
	"context"
	"encoding/json"
	"errors"
	"fmt"
	"io/ioutil"
	"net/http"
	"net/url"

	httptransport "github.com/go-kit/kit/transport/http"
)

type fangkeReq struct {
	Name string `json:"name"`
}

type fangkeRsp struct {
	Result string `json:"result"`
}

type queryReq struct {
	Name string `json:"name"`
}

type queryRsp struct {
	Num int `json:"num"`
}

func encodeFangke(_ context.Context, request *http.Request, req interface{}) error {
	var buf bytes.Buffer
	if err := json.NewEncoder(&buf).Encode(req); err != nil {
		fmt.Println("request json fail..", err.Error())
		return err
	}
	request.Body = ioutil.NopCloser(&buf)

	return nil
}

func decodeFangke(_ context.Context, rsp *http.Response) (response interface{}, err error) {
	if rsp.StatusCode != http.StatusOK {
		fmt.Println("rsp json fail.", err.Error())
		return nil, errors.New(rsp.Status)
	}

	var resp fangkeRsp
	err = json.NewDecoder(rsp.Body).Decode(&resp)

	return resp, err
}

func encodeQuery(_ context.Context, request *http.Request, req interface{}) error {
	var buf bytes.Buffer
	if err := json.NewEncoder(&buf).Encode(req); err != nil {
		fmt.Println("request json fail..", err.Error())
		return err
	}
	request.Body = ioutil.NopCloser(&buf)

	return nil
}

func decodeQuery(_ context.Context, rsp *http.Response) (response interface{}, err error) {
	if rsp.StatusCode != http.StatusOK {
		fmt.Println("rsp json fail.", err.Error())
		return nil, errors.New(rsp.Status)
	}

	var resp queryRsp
	err = json.NewDecoder(rsp.Body).Decode(&resp)

	return resp, err
}

func fangkeClient() {
	target, err := url.Parse("http://127.0.0.1:8000/fangke")
	if err != nil {
		fmt.Println("err:", err.Error())
		return
	}

	cli := httptransport.NewClient(http.MethodGet, target, encodeFangke, decodeFangke)
	if cli == nil {
		fmt.Println("create http cli fail.")
		return
	}

	request := fangkeReq{"fathor"}
	rsp, err := cli.Endpoint()(context.TODO(), request)
	if err != nil {
		fmt.Println("rsp err, err:", err.Error())
		return
	}

	fmt.Println(rsp)

	return
}

func queryClient() {
	target, err := url.Parse("http://127.0.0.1:8000/query")
	if err != nil {
		fmt.Println("err:", err.Error())
		return
	}

	cli := httptransport.NewClient(http.MethodGet, target, encodeQuery, decodeQuery)
	if cli == nil {
		fmt.Println("create http cli fail.")
		return
	}

	request := queryReq{"xiaoming"}
	rsp, err := cli.Endpoint()(context.TODO(), request)
	if err != nil {
		fmt.Println("rsp err, err:", err.Error())
		return
	}

	fmt.Println(rsp)
}

func main() {
	fangkeClient()
	queryClient()

	return
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尘帝阁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值