2012-12-18 76 views
2

我正在使用grails應用程序,並且幾個小時已經試圖從請求中獲取html代碼。我想要做的是獲得普通的html(比如在一個webPage源代碼中,包含所有標籤和東西),以便我可以處理它。從HTTP請求獲取純HTML HTML代碼

我已經設法得到它爲我的這個代碼GET請求:

url = ("http://google.com").toURL().getText()) 

它工作得很好,但我也需要能夠進行POST請求。

我試過httpBuilder,但我得到的響應看起來像格式化文本(與空白和東西),但沒有任何html標籤,我需要它們。我使用的代碼如下所示:

def url = "http://urlToRemoteServer.com/" 
def http = new HTTPBuilder(url); 


http.post(path: 'pathToMyApp', 
     requestContentType: "text/xml") { resp, reader -> 

      println "Tweet response status: ${resp.statusLine}" 
      assert resp.statusLine.statusCode == 200 
      System.out << reader 
     } 

誰能告訴我如何獲取該html代碼?我正在研究groovy,但Java解決方案將會同樣出色。

回答

2

更改後的地圖以包括contentType強制純文本解析(和,我相信更改爲Accepts頭)如下:

http.post(path: 'pathToMyApp', 
      requestContentType: "text/xml", 
      contentType: "text/xml") { resp, reader -> 

或者,您可以更改解析器通過這一點,將來的請求加入ParserRegistry重映射的構造之後:

http.parser.'text/html' = http.parser.'text/plain' 

您還可以添加一個調用setContentType(),你的構造函數調用後HTTPBuilder

//... 
def http = new HTTPBuilder(url); //existing code 
http.contentType = ContentType.TEXT //new addition 
http.post(path: 'pathToMyApp', //existing code 
//... 
+1

改變解析器的信息並獲得成功 - THX非常 – dulcyn

1

另一種方式,你可以做到這一點:

import static groovyx.net.http.ContentType.TEXT 
import static groovyx.net.http.ContentType.URLENC  

def url = "http://urlToRemoteServer.com/" 

def http = new HTTPBuilder(url); 

http.request(Method.POST, TEXT) { resp, reader -> 

    println "Tweet response status: ${resp.statusLine}" 
    assert resp.statusLine.statusCode == 200 
    println reader.text 
} 

鬆散的基礎上包含在http://groovy.codehaus.org/modules/http-builder/doc/contentTypes.html

+0

我想你可能需要在這種情況下改變關閉。至少在0.6版本中,2-arg版本不適用於request()。請注意,請求內容類型也由此改變。 –

0
public static post(String url, String data, def contentType = ContentType.XML) { 
    def client = new HTTPBuilder(url) 
    def xml = null 
    client.request(groovyx.net.http.Method.POST) { 
     contentType = contentType 
     requestContentType = contentType 
     body = data 
     response.success = { resp, raw -> 
      println "Success response: ${resp.statusLine} ->\n${raw.text}" 
      xml = [status: resp.statusLine, response:raw] 
     } 
     response.failure = { resp, raw -> 
      println "Error response: ${resp.statusLine} ->\n${raw.text}" 
      xml = [status: resp.statusLine, response:raw] 
     }  
    } 
    return xml 
}