对于一个很长的问题,我提前道歉。希望你能忍受我。
我正在使用goweb库,并尝试使用示例 Web 应用程序。
我一直在尝试修改RESTful 示例代码,它将 a 定义Thing
为:
type Thing struct {
Id string
Text string
}
AThing是通过向 发送HTTP Post带有适当JSON正文的请求来创建的http://localhost:9090/things。这是在Create函数的示例代码中处理的,特别是以下几行:
dataMap := data.(map[string]interface{})
thing := new(Thing)
thing.Id = dataMap["Id"].(string)
thing.Text = dataMap["Text"].(string)
这一切都很好,我可以运行示例服务器(侦听http://localhost:9090/)并且服务器按预期运行。
例如:
curl -X POST -H "Content-Type: application/json" -d '{"Id":"TestId","Text":"TestText"}' http://localhost:9090/things
没有错误返回,然后我GET是Thing用
curl http://localhost:9090/things/TestId
它返回
{"d":{"Id":"TestId","Text":"TestText"},"s":200}
到现在为止还挺好。
现在,我想修改Thing类型,并添加自定义ThingText类型,如下所示:
type ThingText struct {
Title string
Body string
}
type Thing struct {
Id string
Text ThingText
}
这本身不是问题,我可以Create像这样修改函数:
thing := new(Thing)
thing.Id = dataMap["Id"].(string)
thing.Text.Title = dataMap["Title"].(string)
thing.Text.Body = dataMap["Body"].(string)
并运行前一个curl POST请求,JSON设置为:
{"Id":"TestId","Title":"TestTitle","Title":"TestBody"}
它返回没有错误。
我再次可以GET访问ThingURL,它返回:
{"d":{"Id":"TestId","Text":{"Title":"TestTitle","Body":"TestBody"}},"s":200}
再一次,到目前为止,很好。
现在,我的问题:
如何修改Create函数以允许我对其进行POST复杂JSON处理?
例如,JSON上面最后返回的字符串包括{"Id":"TestId","Text":{"Title":"TestTitle","Body":"TestBody"}}. 我希望能够POST 精确JSON到端点并Thing创建。
我已经按照代码回来了,似乎该data变量的类型Context.RequestData()来自https://github.com/stretchr/goweb/context,而内部Map似乎是Object.Map来自https://github.com/stretchr的类型/stew/,描述为“具有附加有用功能的地图[字符串]接口{}。” 特别是,我注意到“支持点语法来设置深度值”。
我不知道如何设置thing.Text.Title = dataMap...语句以便将正确的JSON字段解析为它。除了 中的string类型之外,我似乎无法使用任何其他内容dataMap,如果我尝试这样JSON做,则会出现类似于以下内容的错误:
http: panic serving 127.0.0.1:59113: interface conversion: interface is nil, not string
再次对这个可笑的长问题表示抱歉。我非常感谢您的阅读,以及您可能需要提供的任何帮助。谢谢!
相关分类