Плагин 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
   }

}

Надеюсь, это кому-нибудь поможет.

Другие вопросы по тегам