在Go中实现的Web服务中,我希望能够根据用户的角色限制JSON响应中返回的字段.
例如,我可能有一个具有角色的当前登录用户和具有该角色的guest另一个用户admin
对于管理员,我希望json拥有所有密钥,例如
{
id: 1,
name: "John",
role: "admin"
}
Run Code Online (Sandbox Code Playgroud)
并且对于客人没有角色密钥,例如
{
id: 1,
name: "John"
}
Run Code Online (Sandbox Code Playgroud)
我现在可以编组json并返回所有字段.我需要能够限制它.
我github.com/moovweb/gokogiri用来解析XML文档.以下在解析var b时工作,但是当我尝试相同的on var a(具有命名空间)时,我没有输出.如何解析具有命名空间的XML gokogiri?
package main
import (
"github.com/moovweb/gokogiri"
"github.com/moovweb/gokogiri/xpath"
"log"
)
func main() {
log.SetFlags(log.Lshortfile)
doc, _ := gokogiri.ParseXml([]byte(a))
defer doc.Free()
doc.SetNamespace("", "http://example.com/this")
x := xpath.Compile(".//NodeA/NodeB")
groups, err := doc.Search(x)
if err != nil {
log.Println(err)
}
for i, group := range groups {
log.Println(i, group)
}
}
var a = `<?xml version="1.0" ?><NodeA xmlns="http://example.com/this"><NodeB>thisthat</NodeB></NodeA>`
var b = `<?xml version="1.0" ?><NodeA><NodeB>thisthat</NodeB></NodeA>`
Run Code Online (Sandbox Code Playgroud)
编辑#1:我也试过doc.RegisterNamespace但得到了
doc.RegisterNamespace undefined(type*xml.XmlDocument没有字段或方法RegisterNamespace)"
并x.RegisterNamespace得到
x.RegisterNamespace undefined(type*xpath.Expression没有字段或方法RegisterNamespace)"
我的XML包含一组预定义元素,但我无法获取数组.这是XML结构:
var xml_data = `<Parent>
<Val>Hello</Val>
<Children>
<Child><Val>Hello</Val></Child>
<Child><Val>Hello</Val></Child>
<Child><Val>Hello</Val></Child>
</Children>
</Parent>`
Run Code Online (Sandbox Code Playgroud)
这是完整的代码,这里是游乐场链接.运行它将获取Parent.Val,但不是Parent.Children.
package main
import (
"fmt"
"encoding/xml"
)
func main() {
container := Parent{}
err := xml.Unmarshal([]byte(xml_data), &container)
if err != nil {
fmt.Println(err)
} else {
fmt.Println(container)
}
}
var xml_data = `<Parent>
<Val>Hello</Val>
<Children>
<Child><Val>Hello</Val></Child>
<Child><Val>Hello</Val></Child>
<Child><Val>Hello</Val></Child>
</Children>
</Parent>`
type Parent struct {
Val string
Children []Child
}
type Child struct {
Val string
}
Run Code Online (Sandbox Code Playgroud)
编辑:我在这里简化了一下这个问题.基本上我不能解组任何数组,而不仅仅是预定义的结构.以下是更新的工作代码.在该示例中,只有一个项目在容器界面中结束.
func main() {
container := []Child{} …Run Code Online (Sandbox Code Playgroud) 我使用 go-chi 作为 HTTP 路由器,我想在另一种方法中重用一种方法
func Registration(w http.ResponseWriter, r *http.Request) {
b, err := ioutil.ReadAll(r.Body) // if you delete this line, the user will be created
// ...other code
// if all good then create new user
user.Create(w, r)
}
...
func Create(w http.ResponseWriter, r *http.Request) {
b, err := ioutil.ReadAll(r.Body)
// ...other code
// ... there I get the problem with parse JSON from &b
}
Run Code Online (Sandbox Code Playgroud)
user.Create 返回错误 "unexpected end of JSON input"
其实,在我执行的ioutil.ReadAll
user.Create停止解析JSON,
在r.Body …
我正在创建一个 docker golang 映像,但我的 golang 应用程序需要在启动时读取 config.yaml。我尝试添加文件,如下面的 dockerfile 所示:
FROM golang:alpine as builder
# Install git + SSL ca certificates
RUN apk update && apk add git && apk add ca-certificates
# Create appuser
COPY . $GOPATH/src/github.com/user/app/
WORKDIR $GOPATH/src/github.com/user/app/
#get dependancies
RUN go get -d -v
#build the binary
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o /go/bin/app
# STEP 2 build a small image
# start from scratch
FROM scratch
COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
ADD ./config.yaml /go/bin/app/
# Copy our …Run Code Online (Sandbox Code Playgroud) 在go模板中,我想获取循环中的最后一条消息,以在循环外使用:
{{range $m := .messages}}
<div>Message subject: {{$m.Subject}}</div>
{{$lastMsg := $m}}
{{end}}
<div>The last message's subject: {{$lasMsg.Subject}}</div>
Run Code Online (Sandbox Code Playgroud)
但这不起作用,并且出现此错误:
undefined variable "$lastMsg"
Run Code Online (Sandbox Code Playgroud)
我也尝试过,{{.lastMsg := $m}}但随后得到:
unexpected ":=" in operand
Run Code Online (Sandbox Code Playgroud)
那么我该如何解决呢?
在 linux 中,stat结构体包含文件的 UID 和 GID。
有没有办法使用 Go(lang) 获取文件的相同信息(UID 和 GID)?
我有一个 Go 字符串x := "2020-09-01T21:46:43Z"
这是我的 Protobuf3:
message MyMessage {
google.protobuf.Timestamp mytimestamp = 1;
}
Run Code Online (Sandbox Code Playgroud)
我怎样才能把这个字符串转换x成a google.protobuf.Timestamp?
我正在尝试获取状态为 200 的https://www.avito.ru/moskva页面的正确正文。
req, err := http.NewRequest("GET", "https://www.avito.ru/moskva", nil)
req.Header.Add("User-Agent", "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:81.0) Gecko/20100101 Firefox/81.0")
req.Header.Add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8")
client := &http.Client{}
res, err := client.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
fmt.Println(res.Status)
printBody(res) // prints body of page
Run Code Online (Sandbox Code Playgroud)
输出:
403 Forbidden
"security stub from site (says that my ip banned)"
Run Code Online (Sandbox Code Playgroud)
我可以在浏览器中打开此页面,而不会出现任何警告。
我用 python 成功获取了 body:
import requests
session = requests.Session()
session.headers = {
'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:81.0) Gecko/20100101 Firefox/81.0',
'Accept-Language': …Run Code Online (Sandbox Code Playgroud) go ×9
xml ×2
docker ×1
go-templates ×1
http ×1
json ×1
libxml2 ×1
linux ×1
middleware ×1
stat ×1
web-scraping ×1