Groovy собственное решение для PUT в API просмотра файлов Bitbucket - PullRequest
0 голосов
/ 18 июня 2020

Я пытался создать (или загрузить) файл в репозиторий Bitbucket Server, установленный в нашей организации, с помощью собственного сценария Groovy. Я понял, что для API просмотра требуются данные, состоящие из нескольких частей, и мне было трудно работать с HttpURLConnection, чтобы это произошло. После множества проб и ошибок я теперь получаю код возврата 500, но у меня нет доступа к журналам сервера.

Вот командная строка curl, которая отлично работает:

curl -X PUT -u chris:xxxxx -F content="I want this content to show up in the file" -F message="Updated via curl" -F branch=master https://stash.myorg.com/stash/rest/api/1.0/users/chris/repos/myRepo/browse/sometext.txt

Выполнял ли кто-нибудь действие POST или PUT для составных данных с использованием собственных библиотек Groovy (или той же библиотеки в Java)? Я избегаю зависимых библиотек, потому что работаю в большой организации, где это может вызвать трудности.

Вот мой код на данный момент ...

// Local variables
StringBuilder formData = new StringBuilder("\n")
basicAuth = "Basic Y3NoZXJpAAAvcmNlZZdha2VuczA3"
// Create URL
URL url = ("https://stash.myorg.com/stash/rest/api/1.0/users/chris/repos/myRepo/browse/sometext.txt").toURL()

// Open connection
HttpURLConnection connection = url.openConnection()
connection.setRequestMethod("PUT")

connection.setDoOutput(true)
connection.setRequestProperty("Content-Type", "multipart/form-data")
connection.setRequestProperty("Accept", "application/json")
connection.setRequestProperty ("Authorization", basicAuth)

// manually build form data, a complete hack
formData.append(addData("content", "I want this content to show up in the file"))
formData.append(addData("message", "Posted via Bitbucket API"))
formData.append(addData("branch", "master"))

// write input
connection.getOutputStream().write(formData.toString().getBytes("UTF-8"))
def postRC = connection.getResponseCode()
if(postRC.equals(200)) {
    println(connection.getInputStream().getText())
}
else {
    println(connection.getErrorStream().getText())
}

// function to support manual form building - again a complete hack
private String addData(String key, String value) {
    StringBuilder sb = new StringBuilder('Content-Disposition: form-data; name="')
    sb.append(key)
    sb.append("\n\n")
    sb.append(value)
    sb.append("\n\n")
    return sb.toString()
}
...