2016-04-26 3 views
1

Es gibt ein cURL Beispiel in Abschnitt Triggering a Build von TeamCity 9.x Documentation:Wie wird das Python-Request-Modul und die TeamCity-API zum Auslösen eines Builds verwendet?

curl -v -u user:password http://teamcity.server.url:8111/app/rest/buildQueue --request POST --header "Content-Type:application/xml" --data-binary @build.xml

Ich mag würde wissen, wie es in einen äquivalenten Python-Skript zu konvertieren (mit POST Anforderung vom requests Modul)?


BTW, habe ich versucht, das folgende Python-Skript bekam aber eine solche Antwortcode 400 (Bad Request):

url = "http://myteamcity.com:8111/httpAuth/app/rest/buildQueue/" 
headers = {'Content-Type': 'application/json'} 
data = json.dumps({'buildTypeId': 'MyTestBuild'}) 
r = requests.post(url, headers=headers, data=data, auth=("username", "password"), timeout=10) 
print "r = ", r 

>> r = <Response [400]> 

Wenn die Content-Type in headers in Accept ändern, bekam einen anderen Antwortcode 415 (Unsupported Media Type):

headers = {'Accept': 'application/json'} 

>> r = <Response [415]> 
+0

Der Curl Beispiel * XML * sendet, nicht JSON. Warum versuchst du * JSON * zu senden? –

+0

Die Dokumentation ist ein wenig durcheinander; Es scheint mir, dass dieser API-Endpunkt * nur * XML im POST-Body akzeptieren kann. –

+0

Soweit ich weiß, verwendet Requests Modul JSON Datenformat, wie in der Dokumentation gezeigt: http://docs.python-requests.org/en/latest/user/quickstart/#more-complicated-post-requests –

Antwort

1

Die Dokumentation zum Auslösen eines Builds zeigt, dass Sie senden müssen XML, nicht JSON:

<build> 
    <buildType id="buildConfID"/> 
</build> 

Die Teamcity REST API ist ein Bit eines Mischbeutel; Einige Methoden akzeptieren sowohl XML als auch JSON, einige akzeptieren nur XML. Dies ist eine dieser letzteren Methoden. Sie reagieren entweder mit XML oder JSON, basierend auf dem, was Sie den Header Accept zu setzen.

Senden Sie das obige mit Ihrer erforderlichen Build-ID; für ein XML-Dokument, das Sie einfach Templat verwenden:

from xml.sax.saxutils import quoteattr 

template = '<build><buildType id={id}/></build>' 

url = "http://myteamcity.com:8111/httpAuth/app/rest/buildQueue/" 
headers = {'Content-Type': 'application/xml'} 
build_id = 'MyTestBuild' 
data = template.format(id=quoteattr(build_id)) 

r = requests.post(url, headers=headers, data=data, auth=("username", "password"), timeout=10) 

Bitte beachte, dass ich die xml.sax.saxutils.quotattr() function verwendet, um sicherzustellen, dass der Wert von build_id richtig für die Aufnahme als XML-Attribut angegeben.

Dies wird XML erzeugen; Fügen Sie 'Accept': 'application/json' zu dem headers Wörterbuch hinzu, wenn Sie eine JSON-Antwort verarbeiten möchten.

+0

Martijn, vielen Dank! Bevor ich Ihre Lösung gesehen habe, habe ich die Daten wie folgt angegeben: 'data =" "'. Für –

+0

Wenn die Daten komplizierter werden, ist meine einfache Methode fehleranfällig. –

0

FYI json Anfrage arbeitet in Teamcity 10.

Verwandte Themen