【问题标题】:HTTP authentication in Groovy?Groovy 中的 HTTP 身份验证?
【发布时间】:2016-03-03 21:00:46
【问题描述】:
def http = new HTTPBuilder(url)
http.auth.basic username, password

def data = new URL(url)

def response = data.getText()

def relativePaths = new XmlParser().parseText(response)

relativePaths.each {page ->

    def link = page.content.@href.first()

    if(link.contains(".txt")){
        println link
    }

}

嗨,

当尝试运行它时,我得到一个 401。看起来像这里:

def response = data.getText()

它实际上不再经过身份验证(或根本没有)?在 Ruby 中,我会这样写:

(open(url, :http_basic_authentication => [username, password])
data = Nokogiri::XML(open(url, :http_basic_authentication => [username, password])))

在 Groovy 中会是什么样子?我使用httpbuilder 错了吗?提前非常感谢!

更新 1:

应用更改后:

def http = new HTTPBuilder(url)
http.auth.basic username, password

http.get(path: url, contentType: ContentType.TEXT) { resp, reader ->

    def relativePaths = new XmlParser().parse(reader)

    relativePaths.each { page ->

        def link = page.content.@href.first()

        if (link.contains(".txt")) {
            println link
        }
    }
}

我得到一个 406:

响应码:406;找到处理程序:org.codehaus.groovy.runtime.MethodClosure@5be46f9d 捕获:groovyx.net.http.HttpResponseException:不可接受 groovyx.net.http.HttpResponseException: 不可接受

更新 2:

还是不行。我将 contentType 更改为 XML 并将路径更改为实际路径,但收到错误消息:

GET <URL>/<PATH>:(id:ContinuousIntegration_BuildTestDistribute)/artifacts/children/
Response code: 200; found handler: ArtifactDownloader$_run_closure1@5be46f9d
Parsing response as: application/xml
Could not find charset in response; using UTF-8
Parsed data to instance of: class groovy.util.slurpersupport.NodeChild
Caught: groovy.lang.MissingMethodException: No signature of method: groovy.util.XmlParser.parse() is applicable for argument types: (groovy.util.slurpersupport.NodeChild) values: []
Possible solutions: parse(java.io.File), parse(java.io.InputStream), parse(java.io.Reader), parse(java.lang.String), parse(org.xml.sax.InputSource), use([Ljava.lang.Object;)
groovy.lang.MissingMethodException: No signature of method: groovy.util.XmlParser.parse() is applicable for argument types: (groovy.util.slurpersupport.NodeChild) values: []
Possible solutions: parse(java.io.File), parse(java.io.InputStream), parse(java.io.Reader), parse(java.lang.String), parse(org.xml.sax.InputSource), use([Ljava.lang.Object;)
    at ArtifactDownloader$_run_closure1.doCall(ArtifactDownloader.groovy:14)
    at groovyx.net.http.HTTPBuilder$1.handleResponse(HTTPBuilder.java:503)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:218)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:160)
    at groovyx.net.http.HTTPBuilder.doRequest(HTTPBuilder.java:515)
    at groovyx.net.http.HTTPBuilder.get(HTTPBuilder.java:285)
    at groovyx.net.http.HTTPBuilder$get.call(Unknown Source)
    at ArtifactDownloader.run(ArtifactDownloader.groovy:12)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)

只是为了比较,Ruby 脚本。也许httpbuilder 不是我想要的?我实际上只是想将其用于身份验证。

(open(url, :http_basic_authentication => [username, password])
data = Nokogiri::XML(open(url, :http_basic_authentication => [username, password])))

relativePaths = data.xpath("//content/@href")

relativePaths.each { |path| 
    if path.text.include? ".apk"
        puts "<URL>:<PORT>"+path.text
    end
}

【问题讨论】:

    标签: authentication groovy httpbuilder


    【解决方案1】:

    你准备好接受手掌了吗?

    您创建了一个HTTPBuilder 并且...从未使用过它。一切就绪……

    def http = new HTTPBuilder(url)
    http.auth.basic(username, password)
    

    ...但随后使用了新的URL 来检索数据:

    def data = new URL(url)
    def response = data.getText()
    

    解决方案

    HTTPBuilder 是这样使用的:

    import groovyx.net.http.HTTPBuilder
    import groovyx.net.http.ContentType
    
    http.get(path : path, contentType : ContentType.TEXT) { resp, reader ->
        def relativePaths = new XmlParser().parse(reader)    
        ...
    }
    

    注意:我不确定get() 方法是否在后台运行。

    更新的解决方案

    将内容类型设置为 XML 会指示 HTTPBuilder 解析响应并将解析的文档作为第二个参数提供。该文档表示为Node

    http.get(path : path, contentType : ContentType.XML) { response, node ->
        def relativePaths = node    
        ...
    }
    

    【讨论】:

    • 谢谢!确实是掌心。现在我得到了 406。也许我只是累了 ;-)
    • 内容类型可能有误。它可能应该是 ContentType.XML。轮到我面对面了!
    • 哦,http.get() 的 url 实际上应该是相对于HTTPBuilder 的 url 的路径。例如,url 可能是 google.com 和路径 /search
    • 谢谢!我改变了这些东西,但它似乎仍然不起作用。我在上面发布了 Ruby 代码,才意识到我在那里使用了 xpath。
    • 问题不再在于 HTTPBuilder。它正在验证并提供响应。堆栈跟踪提供了一条线索:将数据解析到以下实例:类 groovy.util.slurpersupport.NodeChild 捕获:groovy.lang.MissingMethodException:没有方法签名:groovy.util.XmlParser.parse() 适用于参数类型:(groovy.util.slurpersupport.NodeChild)。事实证明,HTTPBuilder 在提供响应时会考虑内容类型。在这种情况下,它代表您解析 XML 文档 :) 所以 stream 实际上是一个 Node。我更新了我的答案来证明这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-17
    • 2011-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-21
    • 2012-10-27
    相关资源
    最近更新 更多