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

如何使用Go服务HTTP部分内容?

薛墨一
2023-03-14
问题内容

我有一个用go语言编写的网络服务器,并且正在提供来自不同来源(本地,其他服务器,S3)的一些音频文件。我想为此文件提供部分内容,以便HTML音频标签能够搜索和循环。

我该如何实现?我知道httpServeContent功能可以做到这一点,但是我如何通过自己提供文件来实现呢?我需要在没有此操作的情况下执行此操作,以便可以使用相同的处理程序处理来自不同来源的文件。


问题答案:

提供部分内容并非易事。有关介绍,请参见Wikipedia上的Byte服务。您必须处理特定的状态代码和标头(请求和响应),这虽然不太难,但是您不应该浪费时间自己做。

如果要提供(或从中提供)的内容是文件,则可以http.ServeFile()按照您提到的那样使用该文件,该文件可以处理部分内容(范围请求)。

如果要提供的内容不是文件形式,那么http.ServeContent()您的朋友是:

func ServeContent(w ResponseWriter, req *Request,
    name string, modtime time.Time, content io.ReadSeeker)

是的,它还处理了部分内容的提供(范围请求):

ServeContent优于io.Copy的主要好处在于,它可以正确处理Range请求,设置MIME类型并处理If-Modified-Since请求。

您需要做的就是提供内容的io.ReadSeeker“视图”,这是必需的,以便实现可以“跳转”到客户端请求的部分,即需要提供服务的部分。您可能会问:该怎么做?

bytes包包含一个实现的类型io.ReadSeekerbytes.Reader

因此,例如,如果您的内容为[]byte,则可以这样获得io.ReadSeeker

var content []byte
// fill content
r := bytes.NewReader(content)

如果您没有全部内容[]byte呢?一种选择是提供您自己实现的类型的值io.ReadSeeker

io.ReadSeeker 是:

type ReadSeeker interface {
    Reader
    Seeker
}

io.Reader 包含一种方法:

Read(p []byte) (n int, err error)

io.Seeker 还包含一种方法:

Seek(offset int64, whence int) (int64, error)

您的内容可以在某个地方访问,无论如何,您都知道。Seek()被调用以使您知道内容中需要什么部分(位置),并被Read()调用以便可以填充传递的切片(以提供实际内容)。请注意,这些方法可能会被多次调用,因此您必须跟踪内容(源)中的位置。如果您选择沿着这条路走,请阅读链接接口的文档,以确保您符合接口的“一般合同”,以避免出现意外错误。



 类似资料:
  • 问题内容: 我有以下json: 基于的更改。 知道这一点,有没有办法使该字段保持字符串?这个想法是使用调用传递的正确处理程序,然后在其中使用正确的struct 解析字符串。 例: 先感谢您。 问题答案: 使用json.RawMessage获取字段的原始JSON文本: 像这样使用它: 在操场上跑。

  • 4.4.1.4 创建/使用内部服务 内部服务是除了内部应用以外的应用禁止使用的服务。 它们用于内部开发的应用,以便安全地共享信息和功能。 以下是使用Messenger绑定类型服务的示例。 要点(创建服务): 定义内部签名权限。 需要内部签名权限。 不要定义意图过滤器,并将导出属性显式设置为true。 确认内部签名权限是由内部应用定义的。 尽管意图是从内部应用发送的,但要小心并安全地处理接收到的意图

  • 问题内容: 我想通过在写出响应主体时对其进行哈希处理来计算响应的实体标签。到我计算实体标签时,将实体标签添加到响应标头为时已晚。我想将实体标签添加到预告片中。我看到net / http包支持编写预告片,但我不知道如何使用它们。 预告片代码位于https://golang.org/src/pkg/net/http/transfer.go中。如何在应用程序中设置预告片? 问题答案: 使用bytes.B

  • 当我尝试使用JSP运行我的Web应用程序(基本CRUD)时,GlassFish服务器返回以下消息: HTTP状态500-内部服务器错误 类型异常报告 消息内部服务器错误 说明服务器遇到内部错误,无法满足此请求。 例外 java.lang.NullPointerException 注意GlassFish Server Open Source Edition 4.1日志中提供了异常及其根本原因的完整堆

  • 下面是我的一部分。jsp。 下面是我的错误: HTTP状态500–内部服务器错误 类型异常报告 消息在行[20]处处理[/home.jsp]时发生异常 说明服务器遇到意外情况,无法满足请求。 例外组织。阿帕奇。贾斯珀。JasperException:在第[20]行处理[/home.jsp]时发生异常 17:这是添加信息页 18: Stacktrace:org。阿帕奇。贾斯珀。servlet。Jsp

  • 我有多个微服务。客户端可以通过API网关调用这些微服务,微服务之间也可以相互通信。 理想情况下,请求将来自拥有所有权限的用户的API网关。例如,如果用户(浏览器)需要来自微服务A的数据,则只将该角色授予用户,如果内部微服务A需要来自B的数据(rest call),则不应将该角色分配给用户。 要求:如何限制/授权微服务之间的内部通信,以便只有经授权的微服务才能呼叫其他服务。 选项: > 将所有角色分