4.通过HttpMethod执行不同的服务方法

package Services
import (
    "context"
    "fmt"
    "github.com/go-kit/kit/endpoint"
)
type UserRequest struct { //封装User请求结构体,包含参数名和方法
    Uid    int `json:"uid"`
    Method string
}
type UserResponse struct {
    Result string `json:"result"`
}
func GenUserEnPoint(userService IUserService) endpoint.Endpoint {
    return func(ctx context.Context, request interface{}) (response interface{}, err error) {
        r := request.(UserRequest) //通过类型断言获取请求结构体
        result := "nothings"
        if r.Method == "GET" { //通过判断请求方法走不通的处理方法
            result = userService.GetName(r.Uid)
        } else if r.Method == "DELETE" {
            err := userService.DelUser(r.Uid)
            if err != nil {
                result = err.Error()
            } else {
                result = fmt.Sprintf("userid为%d的用户已删除", r.Uid)
            }
        }
        return UserResponse{Result: result}, nil
    }
}
Transport
package Services
import (
    "context"
    "encoding/json"
    "errors"
    mymux "github.com/gorilla/mux"
    "net/http"
    "strconv"
)
func DecodeUserRequest(c context.Context, r *http.Request) (interface{}, error) { //这个函数决定了使用哪个request来请求
    vars := mymux.Vars(r)
    if uid, ok := vars["uid"]; ok {
        uid, _ := strconv.Atoi(uid)
        return UserRequest{Uid: uid, Method: r.Method}, nil //组装请求参数和方法
    }
    return nil, errors.New("参数错误") //如果发生错误返回给客户端这个错误,如果没有返回endpoint的执行结果
}
func EncodeUserResponse(ctx context.Context, w http.ResponseWriter, response interface{}) error {
    w.Header().Set("Content-type", "application/json")
    return json.NewEncoder(w).Encode(response)
}
EndPoint
package Services
import (
    "context"
    "fmt"
    "github.com/go-kit/kit/endpoint"
)
type UserRequest struct { //封装User请求结构体
    Uid    int `json:"uid"`
    Method string
}
type UserResponse struct {
    Result string `json:"result"`
}
func GenUserEnPoint(userService IUserService) endpoint.Endpoint { //当EncodeUserRequest和DecodeUserResponse都不报错的时候才会走这个函数
    return func(ctx context.Context, request interface{}) (response interface{}, err error) {
        r := request.(UserRequest) //通过类型断言获取请求结构体
        result := "nothings"
        if r.Method == "GET" {
            result = userService.GetName(r.Uid)
        } else if r.Method == "DELETE" {
            err := userService.DelUser(r.Uid)
            if err != nil {
                result = err.Error()
            } else {
                result = fmt.Sprintf("userid为%d的用户已删除", r.Uid)
            }
        }
        return UserResponse{Result: result}, nil
    }
}
4.通过HttpMethod执行不同的服务方法的更多相关文章
- Android service ( 一 ) 三种开启服务方法
		一. Service简介 Service是android 系统中的四大组件之一(Activity.Service.BroadcastReceiver.ContentProvider),它跟 Activ ... 
- .net 开发定时执行的windows服务
		环境:win7+vs2010+Oracle11g+office2010(64位操作系统) 需求:开发定时执行的windows服务从数据库中查询数据下载到指定地址Excel中 一.添加新建项目——win ... 
- gRPC学习之四:实战四类服务方法
		欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ... 
- shell脚本编写自动启动服务方法
		shell脚本编写自动启动服务方法 前言 ln :创建连接文件 默认创建的是硬连接,好比复制 ,但是两个文件会同步命令:ln ./java/android/aa.txt aaa s :创建的是软连接变 ... 
- EFCore执行Sql语句的方法:FromSql与ExecuteSqlCommand
		前言 在EFCore中执行Sql语句的方法为:FromSql与ExecuteSqlCommand:在EF6中的为SqlQuery与ExecuteSqlCommand,而FromSql和SqlQuery ... 
- 让ar执行queryall和queryrow方法返回数组
		让ar执行queryall和queryrow方法返回数组 <?phpnamespace common\components;use \CActiveRecord;use \Yii;use \CD ... 
- dubbo源码分析2-reference bean发起服务方法调用
		dubbo源码分析1-reference bean创建 dubbo源码分析2-reference bean发起服务方法调用 dubbo源码分析3-service bean的创建与发布 dubbo源码分 ... 
- C#制作Windows service服务系列二:演示一个定期执行的windows服务及调试(windows service)
		系列一: 制作一个可安装.可启动.可停止.可卸载的Windows service(downmoon原创) 系列二:演示一个定期执行的windows服务及调试(windows service)(down ... 
- php定时执行PHP脚本一些方法总结
		本文章总结了php定时执行PHP脚本一些方法总结,有,linux中,windows,php本身的方法,有需要的朋友可参考参考. linux下定时执行php脚本 执行PHP脚本 方法1如果你想定时执行某 ... 
随机推荐
- 一张图入门Python【中文版】
			好久没写了,就拿这张图作为开篇吧,重新梳理自己学习的东西,最近两年人工智能炒红了python,devops的提出也把开发.运维整合到了一起,作为一个运维工程师,随着企业自动化运维的提出,光会shell ... 
- pyspark 日常整理
			1 联表 df1.join(df2,连接条件,连接方式) 如:df1.join(df2,[df1.a==df2.a], "inner").show() 连接方式:字符串类型, 如 ... 
- 标签一致项(LC-KSVD)-全文解读
			Learning A Discriminative Dictionary for Sparse Coding via Label Consistent K-SVD 1,同步学习判决字典和线性分类器 2 ... 
- unix高级环境编程学习笔记第七章(未完)
			博客地址:http://www.cnblogs.com/zengjianrong/p/3222081.html 7.1 引言 Main函数调用:命令行参数:存储器布局:如何分配存储器:进程使用env: ... 
- Redis Persistent Replication Sentinel Cluster的一些理解
			Redis Persistent Replication Sentinel Cluster的一些理解 我喜欢把工作中接触到的各种数据库叫做存储系统,笼统地说:Redis.Mysql.Kafka.Ela ... 
- ['1', '2', '3'].map(parseInt) 输出答案和解析
			根据题目可以了解到这道题主要考我们的是对map函数和parseInt函数的熟悉程序,所以我们先来了解这两个函数 map 根据MDN上对于map的解释:map() 方法创建一个新数组,其结果是该数组中的 ... 
- 《 .NET并发编程实战》阅读指南 - 第4章
			先发表生成URL以印在书里面.等书籍正式出版销售后会公开内容. 
- $.fn.extend 与 $.extend的区别
			今天看到别人写的jquery 代码都是这样的 $.fn.extend 所以查询了一下,因为自己不是前端开发,看到这样写的,感觉很牛逼.从百度上搜到的感觉解释的还是挺好的,作为记录,方便以后查找. 搜索 ... 
- js生成一定范围内的随机整数
			Math.floor(Math.random()*(m-n+1)+n) Math.floor(Math.random() * (50 - 1 + 1) + 1): 生成1-50内的随机整数 
- Vue 动态控制页面中按钮是否显示和样式
			<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ... 
