对上一节提到的post这种只会出现在表单或者URL两者其中一个地方的键来说,执行语句r.Form["post"]将返回一个切片,切片里面包含了这个键的表单值或者URL值,就像这样:[456]。而对hello这种同时出现在表单和URL两个地方的键来说,执行语句r.Form["hello"]将返回一个同时包含了键的表单值和URL值的切片,并且表单值在切片中总是排在URL值的前面,就像这样:[sau sheong world]。

如果一个键同时拥有表单键值对和URL键值对,但是用户只想要获取表单键值对而不是URL键值对,那么可以访问Request结构的PostForm字段,这个字段只会包含键的表单值,而不包含任何同名键的URL值。举个例子,如果我们把前面代码中的r.Form语句改为r.PostForm语句,那么程序将打印出以下结果:

map[post:[456] hello:[sau sheong]]

上面这个输出使用的是application/x-www-form-urlencoded内容类型,如果我们修改一下客户端的HTML表单,让它使用multipart/form-data作为内容类型,并对服务器代码进行调整,让它重新使用r.Form语句而不是r.PostForm语句,那么程序将打印出以下结果:

map[hello:[world] thread:[123]]

因为PostForm字段只支持application/x-www-form-urlencoded编码,所以现在的r.Form语句将不再返回任何表单值,而是只返回URL查询值。为了解决这个问题,我们需要通过MultipartForm字段来获取multipart/form-data编码的表单数据。

results matching ""

    No results matching ""