Плагин Grails 'grails-rest-client-builder' с методом запроса PATCH
Я использую grails2.4.4 и плагин grails-rest-client-builder: 2.0.0. Мне нужно вызвать REST URL, который принимает метод запроса, PATCH. Но я не могу сделать с этим плагином: я использую код ниже:
def rest = new RestBuilder()
def resp = rest.patch("$URL") {
header 'Authorization', "Bearer $accessToken"
}
Я получаю ниже ошибки:
Invalid HTTP method: PATCH. Stacktrace follows:
Message: Invalid HTTP method: PATCH
Line | Method
440 | setRequestMethod in java.net.HttpURLConnection
307 | invokeRestTemplate in grails.plugins.rest.client.RestBuilder
280 | doRequestInternal . in ''
Может кто-нибудь помочь мне?
1 ответ
Хорошо. Наконец сделали это после нескольких проб и ошибок. По умолчанию java.net.HttpURLConnection
не поддерживает пользовательский метод запроса, такой как PATCH, я получаю эту ошибку. Так что мне нужно пойти на некоторые сторонние библиотеки, такие как commons-httpclient
который поддерживает такие методы запроса. Так что я вводил commons-httpclient(now it is named as apache-httpcomponents)
чтобы заставить его работать с методом запроса PATCH.
Ниже приведены изменения, которые я сделал, чтобы заставить его работать:
Сначала добавьте зависимость в Grails BuildConfig.groovy
runtime "org.apache.httpcomponents:httpclient:4.3.6"
Решение #1
Если вы хотите перейти к созданию объекта вручную:
RestTemplate restTemplate=new RestTemplate()
restTemplate.setRequestFactory(new HttpComponentsClientHttpRequestFactory());
def rest=new RestBuilder(restTemplate)
def resp = rest.patch("$URL"){
header 'Authorization', "Bearer $accessToken"
}
Решение #2
Использование Grails-Spring Injection:
Добавьте ниже конфигурацию в resources.groovy
import grails.plugins.rest.client.RestBuilder
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory
import org.springframework.web.client.RestTemplate
beans={
httpClientFactory (HttpComponentsClientHttpRequestFactory)
restTemplate (RestTemplate,ref('httpClientFactory'))
restBuilder(RestBuilder,ref('restTemplate'))
}
впрыскивать restBuilder
в вашем классе:
class MyRestClient{
def restBuilder
....
def doPatchRequest(){
def resp=restBuilder.patch("$API_PATH/presentation/publish?id=$presentationId"){
header 'Authorization', "Bearer $accessToken"
};
//do anything with the response
}
}
Надеюсь, это кому-нибудь поможет.