MSSE SENG 5199

Course Materials for the MSSE Web Application Development Course

Consuming REST Services

Marc Kapke

kapkema@gmail.com


Monolith

Microservices


Rise of REST


Why REST took off


Spring RestTemplate


Serialization


Response types


Configurable and Injectable

@Bean
RestTemplate restTemplate(RestTemplateBuilder builder) {
    builder.requestFactory(getClientHttpRequestFactory())
    return builder.build()
}


private static ClientHttpRequestFactory getClientHttpRequestFactory() {
    HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory()
    clientHttpRequestFactory.setConnectTimeout(200)
    clientHttpRequestFactory.setConnectionRequestTimeout(100)
    clientHttpRequestFactory.setReadTimeout(3000)
    return clientHttpRequestFactory
}

Example GET Request

  @Autowired
  RestTemplate restTemplate

  ResponseEntity getArticles(String category, Long time) {
    try {
      restTemplate.getForEntity("https://api.nytimes.com/svc/mostpopular/v2/mostviewed/${category}/${time}.json?api-key=<key>&offset=0", Map)
    }catch (HttpClientErrorException ex){
      return new ResponseEntity([error: ex.message], ex.statusCode)
    }
  }

Testing 3rd party dependencies


Mock 3rd party dependencies


Http layer is tricky to mock


Example Test

@Autowired
RestTemplate restTemplate

@Autowired
TestRestTemplate testRestTemplate

MockRestServiceServer mockServer

def "get articles"() {
  setup:
  mockServer = MockRestServiceServer.createServer(restTemplate)

  mockServer.expect(requestTo(new StringContains("/svc/mostpopular/v2/mostviewed/food/1.json"))).andExpect(method(HttpMethod.GET))
            .andRespond(withSuccess("{}", MediaType.APPLICATION_JSON_UTF8))

  when:
  def responseEntity = testRestTemplate.getForEntity("/articles/food/1", Map)

  then:
  mockServer.verify()


  responseEntity.body == [:]
  responseEntity.statusCode == HttpStatus.OK
}