gpt4 book ai didi

go - 如何通过 postman multipart/form-data传递和解析嵌套对象

转载 作者:行者123 更新时间:2023-12-03 10:10:32 24 4
gpt4 key购买 nike

我有一条适用于multipart/form-data的路线。在尝试通过 postman 传递嵌套对象之前,一切都很好。此函数中有很多代码,但我将此问题删除了,因为这无关紧要。

func (h *handler) SubmitFormNewPark(w http.ResponseWriter, r *http.Request) {
ctx := context.InitFromHTTP(w, r, "submit_form_new_park")
defer ctx.OnExit(nil)

err := r.ParseMultipartForm(0)
if err != nil {
logger.Get().Warn(ctx, "can't parse new park form", zap.Error(err))
h.writeResponse(ctx, w, models.FormParkResponse{Success: false})
return
}

multipartForm := make(map[string]interface{})
for key, value := range r.MultipartForm.Value {
multipartForm[key] = value
}
}
首先一切都很好,因为我没有嵌套对象
enter image description here
但是在添加嵌套对象之后,r.MultipartForm.Value中有不同的键
enter image description here
如果我打印r.MultipartForm.Value我得到下一张 map
map[city:[city] entity_name:[entity_name] ip_info[ip_address]:[ip_address] ip_info[ip_fio]:[ip_fio] name:[Name] office_address:[office address] office_phone:[74954954949]]
但我希望将“ip_info”键作为具有键ip_address和ip_fio的映射
我还尝试使用诸如ip_info [0] [ip_fio]和ip_info [0] [ip_address]之类的键。

最佳答案

您可以使用以下代码解析嵌套对象:
注意:您可以改进此示例以递归地解析嵌套对象中的嵌套对象

package main

import (
"fmt"
"log"
"net/http"
"regexp"
)

var rxNestedKey = regexp.MustCompile(`^(?P<key>[A-Za-z0-9_]+)\[(?P<n_key>[A-Za-z0-9_]+)\]$`)

func Handler(w http.ResponseWriter, r *http.Request) {
err := r.ParseMultipartForm(0)
if err != nil {

return
}

multipartForm := map[string]interface{}{}
nestedBuf := map[string]map[string]interface{}{}

for key, value := range r.MultipartForm.Value {
// check key has nested key
if rxNestedKey.MatchString(key) {
// parse nested key (nK) and key (k)
k := rxNestedKey.FindStringSubmatch(key)[1]
nK := rxNestedKey.FindStringSubmatch(key)[2]

if nestedBuf[k] == nil {
nestedBuf[k] = map[string]interface{}{}
}
nestedBuf[k][nK] = value
} else {
multipartForm[key] = value
}
}

// collect all nested data from buff
for k, v := range nestedBuf {
multipartForm[k] = v
}

fmt.Printf("%+v\n", multipartForm)
}

func main() {
http.HandleFunc("/", Handler)
log.Fatal(http.ListenAndServe("localhost:8080", nil))
}
request
解析为:
map [ip:map [address:[127.0.0.1] port:[8080]] office_city:[Moscow] office_phone:[7845612349879]]

关于go - 如何通过 postman multipart/form-data传递和解析嵌套对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65806158/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com