我正在尝试使用Groovy HTTPBuilder发送POST,但我想发送的数据已经过URL编码,因此我希望HTTPBuilder按原样发布。我尝试了以下方法:
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)
答案 0 :(得分:6)
由于您使用的是预编码的表单值,因此无法使用默认的基于地图的内容类型编码器。您必须指定内容类型,以便EncoderRegistry
知道如何处理正文。
您可以使用指定正文是URL编码字符串的内容类型创建HttpBuilder:
def http = new HTTPBuilder(url, ContentType.URLENC)
或者让请求明确传递内容类型:
http.request(Method.POST, ContentType.URLENC) {
// etc.
作为参考,这是我如何弄清楚的 - 在我读这个问题之前我不知道。
request
方法的API文档,了解封闭预期包含的内容。我只是在传递中使用了HTTPBuilder
,所以我想看看body
“应该”或“可能”是什么,如果两者不同的话。 RequestConfigDelegate
class链接,并在其文档中讨论了这些选项。RequestConfigDelegate.setBody
method是body
setter所在的,它表示正文“[...]可以是关联request encoder支持的任何类型。” body
的值将由与当前request content-type关联的编码器解释。“EncoderRegistry
类。它有一个encode_form
method取一个字符串并声明它“假设String是一个已编码的POST字符串”。听起来不错。HttpBuilder
内部类方法RequestConfigDelegate.getRequestContentType
,该方法又有ContentType
enum的链接。URLENC
value让我相信这是最好的猜测。HTTPBuilder
ctor taking a content type,这很有效。request
方法并注意到有一个版本也采用了内容类型。我猜这总时间约为5-10分钟,比我输入的内容要短得多。但是,希望你能说服你,通过文档以相对较短的顺序找到这样的东西是。
IMO这对开发人员来说是一项关键技能,可以让你看起来像个英雄。它很有趣。