当前位置: 首页 > 面试题库 >

Golang:异步HTTP服务器中的共享通信

彭修筠
2023-03-14
问题内容

除了编写简单的http服务器之外,绝对是golang的初学者。我正在研究Go作为编写异步过程的一种可能性。如果可以的话,请提供一个简单的示例来说明如何实现:

Http请求’a’进入,基于该请求中的POST负载启动操作(在post或url中带有某种唯一标识符)。当请求“ a”仍处于打开状态时,以“
a”开始的异步过程将以原始唯一标识符(请求“ b”)响应同一服务器。我想根据请求“ b”响应将该响应传达回请求“ a”。


问题答案:

尽管可以使用通道执行此操作,但我更希望使用受互斥锁保护的哈希(映射),因为在这种情况下更容易实现。

为您提供一个想法并助您一臂之力:

package main

import (
    "fmt"
    "net/http"
    "sync"
)

type state struct {
    *sync.Mutex // inherits locking methods
    Vals map[string]string // map ids to values
}

var State = &state{&sync.Mutex{}, map[string]string{}}

func get(rw http.ResponseWriter, req *http.Request) {
    State.Lock()
    defer State.Unlock() // ensure the lock is removed after leaving the the function
    id := req.URL.Query().Get("id") // if you need other types, take a look at strconv package
    val := State.Vals[id]
    delete(State.Vals, id)
    rw.Write([]byte("got: " + val))
}

func post(rw http.ResponseWriter, req *http.Request) {
    State.Lock()
    defer State.Unlock()
    id := req.FormValue("id")
    State.Vals[id] = req.FormValue("val")
    rw.Write([]byte("go to http://localhost:8080/?id=42"))
}

var form = `<html>
    <body>
        <form action="/" method="POST">
            ID: <input name="id" value="42" /><br />
            Val: <input name="val" /><br />
            <input type="submit" value="submit"/>
        </form>
    </body>
</html>`

func formHandler(rw http.ResponseWriter, req *http.Request) {
    rw.Write([]byte(form))
}

// for real routing take a look at gorilla/mux package
func handler(rw http.ResponseWriter, req *http.Request) {
    switch req.Method {
    case "POST":
        post(rw, req)
    case "GET":
        if req.URL.String() == "/form" {
            formHandler(rw, req)
            return
        }
        get(rw, req)
    }
}

func main() {
    fmt.Println("go to http://localhost:8080/form")
    // thats the default webserver of the net/http package, but you may
    // create custom servers as well
    err := http.ListenAndServe("localhost:8080", http.HandlerFunc(handler))
    if err != nil {
        fmt.Println(err)
    }
}


 类似资料:
  • 我可能遗漏了一些非常明显的东西,但我想做的是在组件之间异步共享从服务器获取的数据。 我的服务看起来是这样的: 因为流程是异步的,所以我需要promise响应,但是promise的响应返回实际的subscribe对象,而不是返回的< code>data.json。 这是一个配置文件页面,它由嵌套路由组成,所以我不能将数据传递给路由组件。路由组件之一是帖子,加载配置文件后,它应该开始获取服务中当前用户

  • 使用ws,Node.js WebSocket库,可以让多个服务器共享一个HTTP/S服务器。 有可能用socket.io做同样的事情吗?

  • 问题内容: 我想在控制器之间“绑定更改”异步数据。 我知道这可能有点令人困惑,但我希望有可能。 在以下示例中,如果我在输入中编写内容,则效果很好:http : //jsfiddle.net/Victa/9NRS9/ HTML : JS : 但是,假设我从服务器获取数据。我想像前面的示例一样“链接”数据。http://jsfiddle.net/Victa/j3KJj/ 事实是,我想避免使用“ $ b

  • 异步Http客户端 Get方式 1.使用域名形式 use AsyncHttp; //直接使用域名, get方式 $http = new AsyncHttp('http://groupco.com'); //设置2s超时 $http->setTimeout(2); //$http->setCookies(['token' => 'xxxx']);

  • 问题内容: 我正在尝试用golang写一个Web服务器来处理地理编码请求。其中一些请求需要花费一分钟以上的时间来处理。在这种情况下,尽管处理程序一直在运行,但是服务器似乎正在向客户端返回一个空的主体。我尝试了下面的代码无济于事。我想念什么吗?pat这可能是个问题吗? 客户是红宝石。但我不认为这是问题所在,因为如果使用curl,我会看到类似的行为。 问题答案: 找到了问题。我没有提到我的服务器在Am

  • 我有一个问题,试图找出最好的方法来完成一个简单的应用程序遵循Android最佳实践。下面是场景: 1)我有一个活动,用户输入一些东西,然后发送到后台服务 我不确定处理这种“事件”的标准方法是什么。您是否必须使用广播监听器和订户或它太多为这个简单的目的?