2013-03-14 4 views
1

Пытаюсь искать артефакты с помощью заводной сценария и REST API:Artifactory Поиск по REST API вызывает ошибку "Неверный запрос"

def query = ‘artifactory/api/search/artifact?name=at.mic.all.feature&repos=features-qa-test-snapshot’ 
def server = new RESTClient(‘http://mic-build2.mic.co.at:8081’) 
server.parser.'application/vnd.org.jfrog.artifactory.search.ArtifactSearchResult+json' = server.parser.'application/json' 
def resp = server.get(path: query)      

это вызывает исключение:

groovyx.net.http.HttpResponseException: Bad Request 
    at groovyx.net.http.RESTClient.defaultFailureHandler(RESTClient.java:240) 
    at groovyx.net.http.HTTPBuilder.doRequest(HTTPBuilder.java:508) 
    at groovyx.net.http.RESTClient.get(RESTClient.java:118) 
    at groovyx.net.http.RESTClient$get.call(Unknown Source) 
    at Artifactory.getArtifacts(artifactory.groovy:157) 
… 

Только чтобы проверить, правильно ли сервер и запрос, я пробовал URL-адрес url = server + '/' + (= http://mic-build2.mic.co.at:8081/artifactory/api/search/artifact?name=at.mic.all.feature&repos=features-qa-test-snapshot) в браузере, в результате чего файл, который содержит точно мой результат поиска:

{"results ": [{" uri ":" http://mic-build2.mic.co.at:8081/artifactory/api/storage/features-qa-test-snapshot/at/mic/all/feature/at.mic.all.feature/20130313002236/at.mic.all.feature-20130313002236-win32.win32.x86.zip "}, ... ..}

Итак, мой сервер и запрос кажутся вам в порядке, но не будут работать в моем оригинальном скрипте.

Заранее благодарим за помощь! Frank

ответ

3

Путь uri должен начинаться с '/', HTTP-клиент не добавит его для вас.

def query = ‘/artifactory/api/search/artifact?name=at.mic.all.feature&repos=features-qa-test-snapshot’ 

Это должно сработать.

4

У меня была аналогичная проблема с поиском артефактов (это привело к исключениям «Bad Request» или «Not found»). Причина проблемы заключается в том, что HTTP запрос создается с помощью подхода неверен: в Artifactory request.log я вижу, что запрос

/api/search/artifact?name=test 

превращается в

/api/search/artifact%3Fname=test 

который, очевидно, неправильно запрос HTTP. После исследования RESTClient documentation я нашел правильное решение: сформируйте HTTP-запрос, используя предоставленный API, вместо того, чтобы объединить весь запрос в виде строки самостоятельно.

def queryPath = '/api/search/artifact' 
def server = new RESTClient('http://mic-build2.mic.co.at:8081') 
server.parser.'application/vnd.org.jfrog.artifactory.search.ArtifactSearchResult+json' = server.parser.'application/json' 
def resp = server.get(path: queryPath, query: [name: 'test', repos: 'your-repo']) 

Таким образом, вы можете цепи любые параметры в запросе без необходимости сформировать запрос HTTP вручную с правильными разделителями. Надеюсь, это поможет

Смежные вопросы