2

我正在开发一个 grails 应用程序,并且已经尝试了几个小时从请求中获取 html 代码。我想要做的是获得纯 html(就像在 webPage 源中,带有所有标签和东西),这样我就可以工作了。

我已经设法使用以下代码为我的获取请求获取它:

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

它工作得很好,但我还需要能够发出帖子请求。

我已经尝试过使用 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 解决方案也一样好。

4

3 回答 3

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
//...
于 2012-12-18T19:15:18.423 回答
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中包含的信息

于 2012-12-18T19:31:53.830 回答
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
}
于 2012-12-18T20:21:54.120 回答