1

我在 TeamCity 的一个构建配置中有一个名为“testing”的配置参数。在查看了此处的 TeamCity REST API 文档后,我可以在 Windows 上使用以下 cURL 命令行命令获取有关此参数的信息:

(1) curl -X GET -H "Authorization: Basic (...)" http://teamcity:8080/httpAuth/app/rest/buildTypes/id:bt7/parameters
(2) curl -X GET -H "Authorization: Basic (...)" http://teamcity:8080/httpAuth/app/rest/buildTypes/id:bt7/parameters/testing

回复:

(1) <?xml version="1.0" encoding="UTF-8" standalone="yes"?><property name="testing" value="11"/></properties>
(2) 11

但是,当我尝试使用以下命令更新此“测试”构建参数时,我收到一条错误消息:

curl -X PUT -d "1" -H "Authorization: Basic (...)" http://teamcity:8080/httpAuth/app/rest/buildTypes/id:bt7/parameters/testing

回复:

Error has occurred during request processing (Unsupported Media Type).
Error: javax.ws.rs.WebApplicationException
Not supported request. Please check URL, HTTP method and transfered data are correct.

我已经成功地使用了类似的命令来更新相同构建配置的 buildNumberCounter 设置:

curl -X PUT -d "1" -H "Authorization: Basic (...)" http://teamcity:8080/httpAuth/app/rest/buildTypes/id:bt7/settings/buildNumberCounter

这就是为什么我认为我可以以类似的方式对构建参数做同样的事情。我在这里想念什么?

更新:

我设法使用 Fiddler 更新了值为“1”的“测试”构建参数。我撰写的请求内容如下:

  • 要求:PUT
  • 网址:http://teamcity:8080/httpAuth/app/rest/buildTypes/id:bt7/parameters/testing
  • 请求标头:Authorization: Basic (...)
  • 请求正文:1

所以我上面的 cURL 命令的问题可能在-d "1"选项附近。但是哪里?

更新 2:

我不确定这是否有什么不同,但我在 Windows 7 上使用这个cURL 构建。

4

4 回答 4

2

作为一种解决方法,我们现在没有修复失败的 cURL 命令,而是使用Node.js来编写 REST 请求并将其发送到 TeamCity。

需要馈送到 node.exe 的脚本如下:

// Equivalent cURL command:
// curl -X PUT -d "1" -H "Authorization: Basic (...)" http://teamcity:8080/httpAuth/app/rest/buildTypes/id:bt7/parameters/testing

var http = require('http'),
    options = {
        hostname: 'teamcity',
        port: 8080,
        path: '/httpAuth/app/rest/buildTypes/id:bt7/parameters/testing',
        method: 'PUT',
        headers: { 'Authorization': 'Basic (...)' }
    },
    req;

req = http.request(options, function(res) { });

// write data to request body
req.write('1');
req.end();

尽管解决方法完美无缺,但我仍然想知道上面的 cURL 命令有什么问题?

于 2013-02-21T12:13:18.677 回答
1

我也很难弄清楚这一点,但我找到了答案。而不是在前面使用 -d 和 -H 。在末尾使用 --data 和 --header ,如下所示。我在 TeamCity 文档中发现了这一点,该文档隐藏在“点击展开”示例中。

设置内部版本号计数器:

curl -v --basic --user <username>:<password> --request PUT http://<teamcity.url>/app/rest/buildTypes/<buildTypeLocator>/settings/buildNumberCounter --data <new number> --header "Content-Type: text/plain"

设置内部版本号格式:

curl -v --basic --user <username>:<password> --request PUT http://<teamcity.url>/app/rest/buildTypes/<buildTypeLocator>/settings/buildNumberPattern --data <new format> --header "Content-Type: text/plain"
于 2014-08-29T14:25:12.300 回答
1

对于像您所询问的那样的非 XML 参数,只需添加:--Header "Content-Type: text/plain"

对于 XML 参数,您需要将其切换为:--Header "Content-Type: application/xml"

于 2013-09-04T14:18:17.400 回答
0

我猜REST API期望XML作为输入,添加

-H "Content-type:text/xml"

并将 XML 作为输入。如果你有一个XML文件file.xml

curl -d "@/path/to/file.xml" -H "Content-type:text/xml" (...)
于 2013-02-20T14:34:14.130 回答