How to send a getForObject request with parameters Spring MVC

Felipe Mosso picture Felipe Mosso · Apr 2, 2013 · Viewed 35.5k times · Source

I have a method on the Server side which gives me information about an specific name registered in my database. I'm accessing it from my Android application.

The request to Server is done normally. What I'm trying to do is to pass parameter to the server depending on the name I want to get.

Here's my Server side method:

@RequestMapping("/android/played")
public ModelAndView getName(String name) {
    System.out.println("Requested name: " + name);

    ........
}

Here's the Android request to it:

private Name getName() {
    RestTemplate restTemplate = new RestTemplate();
    // Add the String message converter
    restTemplate.getMessageConverters().add(
        new MappingJacksonHttpMessageConverter());
    restTemplate.setRequestFactory(
        new HttpComponentsClientHttpRequestFactory());

    String url = BASE_URL + "/android/played.json";
    String nome = "Testing";

    Map<String, String> params = new HashMap<String, String>();
    params.put("name", nome);

    return restTemplate.getForObject(url, Name.class, params);
}

In the server side, I'm only getting:

Requested name: null

Is it possible to send parameters to my Server like this?

Answer

Dave G picture Dave G · Apr 2, 2013

The rest template is expecting a variable "{name}" to be in there for it to replace.

What I think you're looking to do is build a URL with query parameters you have one of two options:

  1. Use a UriComponentsBuilder and add the parameters by that
  2. String url = BASE_URL + "/android/played.json?name={name}"

Option 1 is much more flexible though. Option 2 is more direct if you just need to get this done.

Example as requested

// Assuming BASE_URL is just a host url like http://www.somehost.com/
URI targetUrl= UriComponentsBuilder.fromUriString(BASE_URL)  // Build the base link
    .path("/android/played.json")                            // Add path
    .queryParam("name", nome)                                // Add one or more query params
    .build()                                                 // Build the URL
    .encode()                                                // Encode any URI items that need to be encoded
    .toUri();                                                // Convert to URI

return restTemplate.getForObject(targetUrl, Name.class);