我正在尝试使用 Groovy HTTPBuilder 发送 POST,但我要发送的数据已经进行了 URL 编码,因此我希望 HTTPBuilder 按原样进行 POST。我尝试了以下方法:
def validationString = "cmd=_notify-validate&" + postData
def http = new HTTPBuilder(grailsApplication.config.grails.paypal.server)
http.request(Method.POST) {
uri.path = "/"
body = validationString
requestContentType = ContentType.TEXT
response.success = { response ->
println response.statusLine
}
}
但它给了我一个 NullPointerException:
java.lang.NullPointerException
at groovyx.net.http.HTTPBuilder$RequestConfigDelegate.setBody(HTTPBuilder.java:1200)
最佳答案
由于您使用的是预编码表单值,因此您不能使用默认的基于 map 的内容类型编码器。您必须指定内容类型,以便 EncoderRegistry
知道如何处理 body 。
您可以使用指定正文是 URL 编码字符串的内容类型创建 HttpBuilder:
def http = new HTTPBuilder(url, ContentType.URLENC)
或者使请求显式传递内容类型:
http.request(Method.POST, ContentType.URLENC) {
// etc.
作为引用,我是这样想出来的——在阅读这个问题之前我并不知道。
- 查看了
request
方法的 API 文档以查看闭包预期包含的内容。我用过HTTPBuilder
只是路过,所以我想看看具体是什么body
“应该”或“可能”是,以及两者是否不同。 - four-arg version of the request method链接到
RequestConfigDelegate
class并表示在其文档中讨论了这些选项。 -
RequestConfigDelegate.setBody
method ,这就是body
setter 是,声明正文“[...] 可能是关联的 request encoder 支持的任何类型。也就是说,body
的值将由与当前 request content-type 关联的编码器解释。” - request encoder链接是
EncoderRegistry
类(class)。它有一个encode_form
method获取一个字符串并声明它“假定该字符串是一个已经编码的 POST 字符串”。听起来不错。 - 请求内容类型链接指向
HttpBuilder
内部类方法,RequestConfigDelegate.getRequestContentType
,它又链接到ContentType
enum . - 那个枚举有一个
URLENC
value这让我相信这是最好的初步猜测。 - 我尝试了
HTTPBuilder
ctor taking a content type ,这奏效了。 - 圈回
request
方法并注意到有一个版本也采用了内容类型。
我猜总时间大约是 5-10 分钟,比我输入内容所花的时间要短得多。不过,希望它能让您相信,通过文档可以在相对较短的时间内找到这类东西。
在我看来,这是开发人员培养并让您看起来像个英雄的一项关键技能。它可以很有趣。
关于http - 使用 groovy 和数据发送 POST 已经进行了 URL 编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10837461/