我正在研究使用gorilla web工具包来创建一个简单的RPC API.我正在使用他们的文档中的示例,我正在使用Chrome中的Advanced Rest Client进行测试并使用
http://localhost:1111/api/ 
并POST以下RAW JSON有效负载:
{"method":"HelloService.Say","params":[{"Who":"Test"}]}
这到达服务器,我知道这是因为我正在记录它(参见下面的代码),我得到200 OK响应.但是我得到"响应不包含任何数据"
我期待下面的Say方法中定义的JSON回复消息.有没有人对问题是什么有任何建议?
package main
import (
    "gorilla/mux"
    "gorilla/rpc"
    "gorilla/rpc/json"
    "log"
    "net/http"
)  
type HelloArgs struct {
    Who string
}
type HelloReply struct {
    Message string
}
type HelloService struct{}
func (h *HelloService) Say(r *http.Request, args *HelloArgs, reply *HelloReply) error {
    log.Printf(args.Who)
    reply.Message = "Hello, " + args.Who + "!"
    log.Printf(reply.Message)
    return nil
}
func main() {
    r := mux.NewRouter()    
    jsonRPC := rpc.NewServer()
    jsonCodec := json.NewCodec()
    jsonRPC.RegisterCodec(jsonCodec, …如何从内部处理程序正确引用路径名称?
应该mux.NewRouter()全局分配而不是站在一个功能内吗?
func AnotherHandler(writer http.ResponseWriter, req *http.Request) {
    url, _ := r.Get("home") // I suppose this 'r' should refer to the router
    http.Redirect(writer, req, url, 302)
}
func main() {
    r := mux.NewRouter()
    r.HandleFunc("/", HomeHandler).Name("home")
    r.HandleFunc("/nothome/", AnotherHandler).Name("another")
    http.Handle("/", r)
    http.ListenAndServe(":8000", nil)
}
我正在学习Chisel,遵循Github上的文档
到目前为止,一切都完美无瑕.但我坚持第13章 "功能模块创建"
我无法让代码工作.我在凿子模板项目的副本中创建了所有的.scala类.以下是我编写/复制以创建具有可变位宽的Mux4的内容:
/ chisel-template/src/main/scala/Mux4.scala
import Chisel._
class Mux4(w: Int) extends Module {
  val io = IO(new Bundle {
        val sel = UInt(INPUT, 2)
        val in0 = UInt(INPUT, w)
        val in1 = UInt(INPUT, w)
        val in2 = UInt(INPUT, w)
        val in3 = UInt(INPUT, w)
        val out = UInt(OUTPUT, w)
  })
  io.out := Mux2(io.sel(1), 
                    Mux2(io.sel(0), io.in0, io.in1),
                    Mux2(io.sel(0), io.in2, io.in3))
}
class Mux2(w: Int) extends Module {
  val io = IO(new …如何使用时钟边沿作为多路复用器的选择器,我想做什么:
input clk, in1, in2;
output out;
always@ (posedge clk) begin out<=in1; end
always@(negedge clk) begin out<=in2; end
但是,这是不可合成的,因为在单独的always块中有多个驱动程序.有什么工作吗?
这是架构:
客户端向服务器 A 发送 POST 请求
服务器 A 处理这个并向服务器 B 发送一个 GET
服务器 B 通过 A 向客户端发送响应
我虽然最好的想法是制作一个管道来读取 GET 的响应,并写入 POST 的响应,但我遇到了很多类型的问题。
func main() {
    r := mux.NewRouter()
    r.HandleFunc("/test/{hash}", testHandler)
    log.Fatal(http.ListenAndServe(":9095", r))
}
func handleErr(err error) {
    if err != nil {
        log.Fatalf("%s\n", err)
    }
}
func testHandler(w http.ResponseWriter, r *http.Request){
    fmt.Println("FIRST REQUEST RECEIVED")
    vars := mux.Vars(r)
    hash := vars["hash"]
    read, write := io.Pipe()
    // writing without a reader will deadlock so write in a goroutine
    go func() {
        write, …在我的 REST 端点上收到请求后,我想回复状态200和连续生成和刷新的数据主体(从数据库获取,可能非常大)。我正在寻找一种使用Gorilla Mux的有效方法,因为它已在整个项目中使用。
我看到了,这是可能的Labstack回声,因为它的ResponseWriter 支持 http.Flusher(界面允许HTTP处理程序,以冲洗缓冲的数据到客户端)。不幸的是,似乎大猩猩的ResponseWriter不支持这一点。
问题:
不变量:
WebSockets并且应该将解决方案与 REST API 集成。我尝试使用字符串
"/{foo}/{bar:[a-zA-Z0-9=\-\/]+}.{vzz}"
在围棋中。
当我使用时",我看到错误:
unknown escape sequence
当我使用 时',我得到:
cannot use '\u0000' (type rune) as type string in array or slice literal
unknown escape sequence
如何在我的 Go 应用程序中使用此正则表达式进行 MUX?
我正在使用mux实现Rest API。验证了某些参数后,我尝试用一些默认值填充缺失的参数,稍后通过处理请求的方法处理这些默认值,但是,我注意到手动设置查询参数没有任何效果,除非原始查询直接进行改变了一点点hacky:
func ValidateParameters(r *http.Request) (bool) {
     test := r.URL.Query().Get("test")
   // if test is not provided set some default value
    if test == "" {
        r.URL.Query().Set("test", "Test1") //not working
        r.URL.Query().Add("test", "Test2") //not working
        r.URL.RawQuery = r.URL.RawQuery + "&Test=Test3" // the only method working
     }
       // more code
}
该处理程序在另一个文件中,因此我希望能够test := r.URL.Query().Get("test")获取并设置我在ValidateParameters其中设置的值,该值由请求处理程序调用,但这不起作用。
有什么解释吗?有什么办法可以解决吗?
谢谢。
我正在做一个小演示,试图解释一个基本的 HTTP 处理程序是如何工作的,我发现了以下示例:
package main
func router() *mux.Router {
    router := mux.NewRouter()
    auth := router.PathPrefix("/auth").Subrouter()
    auth.Use(auth.ValidateToken)
    auth.HandleFunc("/api", middleware.ApiHandler).Methods("GET")
    return router
}
func main() {
    r := router()
    http.ListenAndServe(":8080", r)
}
package auth
func ValidateToken(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        var header = r.Header.Get("secret-access-token")
        json.NewEncoder(w).Encode(r)
        header = strings.TrimSpace(header)
        if header == "" {
            w.WriteHeader(http.StatusForbidden)
            json.NewEncoder(w).Encode("Missing auth token")
            return
        }
        if header != "SecretValue" {
            w.WriteHeader(http.StatusForbidden)
            json.NewEncoder(w).Encode("Auth token is invalid")
            return
        }
        json.NewEncoder(w).Encode(fmt.Sprintf("Token found. Value %s", header))
        next.ServeHTTP(w, …我有以下创建端点的 API 服务器片段,我想将“clusterID”抽象为处理程序中的路径参数。这是路由器部分
func main() {
    router := mux.NewRouter().StrictSlash(true)
    sub := router.PathPrefix("/api/v1").Subrouter()
    sub.Methods("GET").Path("/device/{clusterID}/job").HandlerFunc(authDev(getJob))
    ... 
下面是处理程序的片段。我像往常一样使用mux.Vars(). 如果我向 发送请求localshost/api/v1/device/cluster123/job,处理程序将按预期被调用,但mux.Vars(r)返回一个空映射,而不是按预期返回带有 的映射clusterID=cluster123。Mux 不支持路径中间的变量吗?我知道我可以手动解析路径,但我希望 Mux 为我做这件事。
func getJob(w http.ResponseWriter, r *http.Request) {
    params := mux.Vars(r)
    log.Println(params["clusterID"]) // outputs an empty string
    log.Println(params) // outputs an empty map
    ...