Html 如何使用HTTPBuilder在Groovy中设置GET响应

Html 如何使用HTTPBuilder在Groovy中设置GET响应,html,json,groovy,server,httpbuilder,Html,Json,Groovy,Server,Httpbuilder,我的YouTrack服务器中存储了几个问题,我想提取这些问题并将信息打包成字符串 我已经使用了RESTClient,但是我得到了错误的输出,因此我想尝试一种不同的方法来使用HttpBuilder提取问题,并将xml响应格式化为JSON。然而,我还不知道如何在Groovy中做到这一点(可能是因为我缺少一个完整的运行示例): 路过 我希望我的代码看起来像这样: def http = new HTTPBuilder('http://www.MyYouTrackServer.com') Authent

我的YouTrack服务器中存储了几个问题,我想提取这些问题并将信息打包成字符串

我已经使用了RESTClient,但是我得到了错误的输出,因此我想尝试一种不同的方法来使用HttpBuilder提取问题,并将xml响应格式化为JSON。然而,我还不知道如何在Groovy中做到这一点(可能是因为我缺少一个完整的运行示例):

路过

我希望我的代码看起来像这样:

def http = new HTTPBuilder('http://www.MyYouTrackServer.com')

AuthenticateMe() // I need that, otherwise I cannot access my server

http.get( path : 'MyIssue-25',
          contentType : JSON,
          query : [???'] ) { resp, reader ->
....        
        // This gap has to be filled somehow,        
        // so that I have a JSONObject or JSONArray, I can work with. 
....
      }
      println 'Response data: -----'
      System.out << reader
      println '\n--------------------'
    }
    String str; // this is the important String containing the data
<issues>
 <issue>
  <comment created="1277899067543" text="is it something wrong?" author="root"/>
  <field name="numberInProject"><value>0</value></field>
  <field name="summary"><value>susjs</value></field>
  <field name="priority"><value>1</value></field>
  <field name="description"><value>at jsjsjsj.mps.E.java at line 12</value></field>
  <field name="created"><value>1277392628191</value></field>
  <field name="updated"><value>1277399118476</value></field>
  <field name="reporterName"><value>root</value></field>
  <field name="updaterName"><value>root</value></field>
  <field name="state"><value>Submitted</value></field>
  <field name="subsystem"><value>No subsystem</value></field>
  <field name="fixedInBuild"><value>Next build</value></field>
  <field name="permittedGroup"><value>All Users</value></field>
 </issue>
</issues>
defhttp=newhttpbuilder('http://www.MyYouTrackServer.com')
AuthenticateMe()//我需要它,否则我无法访问我的服务器
http.get(路径:“MyIssue-25”,
contentType:JSON,
查询:[?']){resp,reader->
....        
//这一差距必须以某种方式填补,
//所以我有一个JSONObject或JSONArray,我可以使用它。
....
}
println'响应数据:--'

System.out为了实现您的目标,您可以使用以下方法来处理json:

import groovyx.net.http.HTTPBuilder


def http = new HTTPBuilder('http://www.MyYouTrackServer.com')
...
http.get(   path : '/MyIssue-25',
            contentType : 'application/json'
        ) { resp, reader ->

        // inside reader you've your json object in `net.sf.json.JSONObject` instance
        println reader

}
考虑到
get()
方法的
query
参数是可选的,此参数用于类似
https://twitter.com/search?q=asd
,对于这种情况,查询参数将是
query:[q:'asd']

因此,回到代码,在您要使用的
阅读器
对象中,看一看

为了展示一个小示例,我有一个服务器,在该服务器上返回以下json
{“a”:“a”,“b”:{“b1”:“b1”,“b2”:“b2”},“c”:“c”}
要使用以下代码:

import groovyx.net.http.HTTPBuilder

def http = new HTTPBuilder('http://localhost')
http.get(   path : '/index.json',
            contentType : 'application/json'
        ) { resp, reader ->

        // cast the object it's not necessary... I cast it 
        // to have the method suggestions by IDE
        net.sf.json.JSONObject read = reader
        println read.get("a") // prints "a"
        println read.get("b").get("b1") // prints "b1"
        //...

        // you can also use this approach 
        println read.a // prints "a"
        println read.b.b1 // prints "b1"
        println read.b // prints [b1:b1, b2:b2]

}
更新

我再次阅读了您的问题,您的描述似乎表明您试图以
xml
格式阅读问题。要做到这一点,其方法与
json
非常相似。在本例中,
reader
对象是的一个实例,假设您的回答与您在问题中给出的答案相似,请查看以下示例:

http = new HTTPBuilder('http://www.MyYouTrackServer.com')
http.get(   path : '/MyIssue-25',
            contentType : 'application/xml'
        ) { resp, reader ->

        //  since your response is an xml now in reader you've GPathResult

        // and now some samples on how to work with the response:

        // get the text of each <field>
        def fields = reader.issue.field*.text();

        fields.each {
            print "$it " // prints 0 susjs 1 at jsjsjsj.mps.E.java at line 12 1277392628191 1277399118476 root root Submitted No subsystem Next build All Users numberInProject
        }

        // another sample... get the name attribute value for the <field> elements
        def namesAttr = reader.issue.field*.@name
        namesAttr.each {
            print "$it " // prints numberInProject summary priority description created updated reporterName updaterName state subsystem fixedInBuild permittedGroup
        }

        // find the <field> value for element which has attribute name="state"
        def field = reader.issue.'*'.findAll {
            it.@name == 'state'
        }

        println field.text() // prints submitted

}
http=newhttpbuilder('http://www.MyYouTrackServer.com')
http.get(路径:'/MyIssue-25',
contentType:“应用程序/xml”
){resp,reader->
//因为您的响应现在是读取器中的xml,所以您已经得到了GPathResult
//下面是一些关于如何处理响应的示例:
//获取每个文档的文本
def fields=reader.issue.field*.text();
每个字段{
打印“$it”//在第12行的jsj.mps.E.java处打印0 susjs 1 1277392628191 1277399118476根用户未提交子系统下一次生成所有用户编号项目
}
//另一个示例…获取元素的名称属性值
def namesAttr=reader.issue.field*@name
名称属性{
打印“$it”//prints numberInProject summary priority description created updated reporterName updaterName state子系统FixedBuild permittedGroup
}
//查找具有属性name=“state”的元素的值
def字段=reader.issue.'*'.findAll{
它。@name=='state'
}
println field.text()//已提交打印
}
另外,在这种情况下,似乎有两个查询参数(project和max)可以使用它。您可以将查询参数添加到
get()
方法中,即:
query:[max:'15']


希望这能有所帮助,

以下是如何将XML响应转换为JSON对象。注意:为了更好地演示输出,我在XML响应中添加了一个附加问题

import groovy.util.XmlParser
import groovy.json.JsonBuilder

def text = '''
<issues>
 <issue>
  <comment created="1277899067543" text="is it something wrong?" author="root"/>
  <field name="numberInProject"><value>0</value></field>
  <field name="summary"><value>susjs</value></field>
  <field name="priority"><value>1</value></field>
  <field name="description"><value>at jsjsjsj.mps.E.java at line 12</value></field>
  <field name="created"><value>1277392628191</value></field>
  <field name="updated"><value>1277399118476</value></field>
  <field name="reporterName"><value>root</value></field>
  <field name="updaterName"><value>root</value></field>
  <field name="state"><value>Submitted</value></field>
  <field name="subsystem"><value>No subsystem</value></field>
  <field name="fixedInBuild"><value>Next build</value></field>
  <field name="permittedGroup"><value>All Users</value></field>
 </issue>

 <issue>
  <comment created="1277899067543" text="does this work?" author="root"/>
  <field name="numberInProject"><value>0</value></field>
  <field name="summary"><value>susjs</value></field>
  <field name="priority"><value>1</value></field>
  <field name="description"><value>at jsjsjsj.mps.E.java at line 12</value></field>
  <field name="created"><value>1277392628191</value></field>
  <field name="updated"><value>1277399118476</value></field>
  <field name="reporterName"><value>root</value></field>
  <field name="updaterName"><value>root</value></field>
  <field name="state"><value>Submitted</value></field>
  <field name="subsystem"><value>No subsystem</value></field>
  <field name="fixedInBuild"><value>Next build</value></field>
  <field name="permittedGroup"><value>All Users</value></field>
 </issue>
</issues>'''

def xml = new XmlParser().parseText(text)
def json = new JsonBuilder()

json xml.issue.inject([]) {list, issue -> 
    def map = [:]

    map.comment = [
        created: issue.comment["@created"][0],
        text: issue.comment["@text"][0],
        author: issue.comment["@author"][0],
    ]


    issue.field.each {field ->
        map[field['@name']] = field.value[0].children()[0]
    }

    list << map

    return list
}

json.toString()

我将XML转换为我认为更合理的数据表示形式。

我很乐意帮助您将XML响应转换为JSON,但我需要您发布一个我可以使用的XML响应。thx,很多:我在我的帖子中添加了一个示例响应。
[
    {
        "comment": {
            "author": "root",
            "created": "1277899067543",
            "text": "is it something wrong?"
        },
        "created": "1277392628191",
        "description": "at jsjsjsj.mps.E.java at line 12",
        "fixedInBuild": "Next build",
        "numberInProject": "0",
        "permittedGroup": "All Users",
        "priority": "1",
        "reporterName": "root",
        "state": "Submitted",
        "subsystem": "No subsystem",
        "summary": "susjs",
        "updated": "1277399118476",
        "updaterName": "root"
    },
    {
        "comment": {
            "author": "root",
            "created": "1277899067543",
            "text": "does this work?"
        },
        "created": "1277392628191",
        "description": "at jsjsjsj.mps.E.java at line 12",
        "fixedInBuild": "Next build",
        "numberInProject": "0",
        "permittedGroup": "All Users",
        "priority": "1",
        "reporterName": "root",
        "state": "Submitted",
        "subsystem": "No subsystem",
        "summary": "susjs",
        "updated": "1277399118476",
        "updaterName": "root"
    }
]