2012-05-31 67 views
3

我想用Groovy HTTPBuilder發送POST,但是我想發送的數據已經被URL編碼了,所以我想讓HTTPBuilder按照原樣發佈。我試過如下:用groovy和數據發送POST已經被URL編碼了

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) 

回答

6

由於您使用的預編碼格式值,你不能使用基於地圖默認的內容類型的編碼器。您必須指定內容類型,以便EncoderRegistry知道如何處理正文。

您可以創建與指定正文的內容類型的HttpBuilder是一個URL編碼的字符串:

def http = new HTTPBuilder(url, ContentType.URLENC) 

或者發出請求傳遞內容明確地鍵入:

http.request(Method.POST, ContentType.URLENC) { 
    // etc. 

作爲參考,這裏是我如何計算出來的 - 在我讀這個問題之前我不知道。

我估計總的時間是5-10分鐘,比鍵入我所做的要短得多。不過,希望它能說服你,找到這種東西可能通過文檔,在相對較短的順序。

海事組織這是開發人員培訓的關鍵技能,讓你看起來像英雄。它可以很有趣。

+0

非常感謝,我會嘗試一下。也就是說,爲了公平起見,您的方法還涉及一些非基本的源代碼逆向工程,以查找不在文檔中的信息。這是我通常所做的事情,但根據經驗,Groovy由於所有的DSL和動態方法而特別雜亂,所以我傾向於將這些問題像消息一樣放在瓶子中,而我繼續像您一樣進行搜索有人已經想出了這個魔術,並且可以使我的搜索更快捷。在目前的情況下,你在我做之前就明白了。這就是說,我仍然必須嘗試它... – Sebastien

+0

@Sebastien我根本沒有看源代碼;上面列出的步驟正是我所做的/看過的。我會更新以更明確地表示我只查看了請求方法文檔。 –