Seb*_*ien 3 groovy encoding http
我正在尝试使用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
}
}
Run Code Online (Sandbox Code Playgroud)
但它给了我一个NullPointerException:
java.lang.NullPointerException
at groovyx.net.http.HTTPBuilder$RequestConfigDelegate.setBody(HTTPBuilder.java:1200)
Run Code Online (Sandbox Code Playgroud)
由于您使用的是预编码的表单值,因此无法使用默认的基于地图的内容类型编码器.您必须指定内容类型,以便EncoderRegistry知道如何处理正文.
您可以使用指定正文是URL编码字符串的内容类型创建HttpBuilder:
def http = new HTTPBuilder(url, ContentType.URLENC)
Run Code Online (Sandbox Code Playgroud)
或者使请求显式传递内容类型:
http.request(Method.POST, ContentType.URLENC) {
// etc.
Run Code Online (Sandbox Code Playgroud)
作为参考,这是我如何弄明白 - 在我阅读问题之前我不知道.
request方法的API文档,看看有什么封预期遏制.我HTTPBuilder只是在传球中使用过,所以我想看看具体的body"应该"或"可能"是什么,如果两者不同的话.RequestConfigDelegate该类,并且在其文档中讨论了这些选项.RequestConfigDelegate.setBody方法就是body设定者所说的那样,主体"[...]可以是相关请求编码器所支持的任何类型.也就是说,该值body将由与当前请求内容相关联的编码器解释 - 类型."EncoderRegistry类.它有一个接受字符串的encode_form方法并声明它"假设String是一个已经编码的POST字符串".听起来不错.HttpBuilder内部类方法RequestConfigDelegate.getRequestContentType,而内部类方法又有一个指向ContentType枚举的链接.URLENC价值,让我相信它是最好的第一个猜测.HTTPBuilderctor采用内容类型,这是有效的.request方法并注意到有一个版本也采用了内容类型.我估计总时间约为5-10分钟,比我输入的内容要短得多.希望它会说服你,但是,要找到这样的东西出来就是通过文档可能在相对较短的时间.
IMO这是开发人员培养的关键技能,让你看起来像英雄.它可以很有趣.
| 归档时间: |
|
| 查看次数: |
5977 次 |
| 最近记录: |