Como postar dados do formulário com o Spring RestTemplate?

148

Desejo converter o seguinte trecho de ondulação (de trabalho) em uma chamada RestTemplate:

curl -i -X POST -d "[email protected]" https://app.example.com/hr/email

Como passo o parâmetro de email corretamente? O código a seguir resulta em uma resposta 404 Não Encontrada:

String url = "https://app.example.com/hr/email";

Map<String, String> params = new HashMap<String, String>();
params.put("email", "[email protected]");

RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> response = restTemplate.postForEntity( url, params, String.class );

Tentei formular a chamada correta no PostMan e posso fazê-la funcionar corretamente especificando o parâmetro email como um parâmetro "form-data" no corpo. Qual é a maneira correta de obter essa funcionalidade em um RestTemplate?

sim
fonte
Tente restTemplate.exchange ();
Estamos Borg
Qual é o tipo de conteúdo aceitável do URL que você forneceu aqui?
Tharsan Sivakumar
Olhar para este blog que está tentando fazer a mesma coisa que eu acho que techie-mixture.blogspot.com/2016/07/...
Tharsan Sivakumar
@TharsanSivakumar O URL retornará JSON.
sim
Possível duplicado de RestTemplate uriVariables não expandida
cellepo

Respostas:

356

O método POST deve ser enviado ao longo do objeto de solicitação HTTP. E a solicitação pode conter cabeçalho HTTP, corpo HTTP ou ambos.

Portanto, vamos criar uma entidade HTTP e enviar os cabeçalhos e parâmetros no corpo.

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);

MultiValueMap<String, String> map= new LinkedMultiValueMap<String, String>();
map.add("email", "[email protected]");

HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<MultiValueMap<String, String>>(map, headers);

ResponseEntity<String> response = restTemplate.postForEntity( url, request , String.class );

http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/client/RestTemplate.html#postForObject-java.lang.String-java.lang.Object-java.lang. Class-java.lang.Object ...-

Tharsan Sivakumar
fonte
1
Você pode consultar este link também para obter mais informações: techie-mixture.blogspot.com/2016/07/…
Tharsan Sivakumar
1
Você salvou o meu dia, eu esperava que o uso do resttemplate fosse bastante óbvio, mas existem alguns truques!
Sergii Getman
1
ResponseEntity<String> response = new RestTemplate().postForEntity(url, request, String.class);Eu estou recebendoorg.springframework.http.converter.HttpMessageNotWritableExc‌​eption: Could not write content: No serializer found for class java.util.Collections$3
Shivkumar Mallesappa
Como passar parâmetro corpo quando os outros estão Cordas mas um deles é do tipo String [], como em dados de solicitação abaixo argsé uma matriz de Cadeiacurl -X POST --data '{"file": "/xyz.jar", "className": "my.class.name", "args": ["100"]}' -H "Content-Type: application/json" localhost:1234/batches
khawarizmi
2
Portanto, isso funciona apenas para strings ... E se eu quiser enviar um objeto java na carga útil?
Devssh #
23

Como postar dados mistos: Arquivo, String [], String em uma solicitação.

Você pode usar apenas o que precisa.

private String doPOST(File file, String[] array, String name) {
    RestTemplate restTemplate = new RestTemplate(true);

    //add file
    LinkedMultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
    params.add("file", new FileSystemResource(file));

    //add array
    UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl("https://my_url");
    for (String item : array) {
        builder.queryParam("array", item);
    }

    //add some String
    builder.queryParam("name", name);

    //another staff
    String result = "";
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.MULTIPART_FORM_DATA);

    HttpEntity<LinkedMultiValueMap<String, Object>> requestEntity =
            new HttpEntity<>(params, headers);

    ResponseEntity<String> responseEntity = restTemplate.exchange(
            builder.build().encode().toUri(),
            HttpMethod.POST,
            requestEntity,
            String.class);

    HttpStatus statusCode = responseEntity.getStatusCode();
    if (statusCode == HttpStatus.ACCEPTED) {
        result = responseEntity.getBody();
    }
    return result;
}

A solicitação POST terá File em seu corpo e na próxima estrutura:

POST https://my_url?array=your_value1&array=your_value2&name=bob 
Yuliia Ashomok
fonte
Eu tentei esse método, mas não funcionou para mim. Estou enfrentando um problema ao fazer uma solicitação POST com os dados no formato de várias partes. Aqui está a minha pergunta se você poderia me guiar com uma solução stackoverflow.com/questions/54429549/...
Profundo Lathia
8

aqui está o programa completo para fazer uma chamada de repouso do POST usando o RestTemplate da primavera.

import java.util.HashMap;
import java.util.Map;

import org.springframework.http.HttpEntity;
import org.springframework.http.ResponseEntity;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;

import com.ituple.common.dto.ServiceResponse;

   public class PostRequestMain {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        MultiValueMap<String, String> headers = new LinkedMultiValueMap<String, String>();
        Map map = new HashMap<String, String>();
        map.put("Content-Type", "application/json");

        headers.setAll(map);

        Map req_payload = new HashMap();
        req_payload.put("name", "piyush");

        HttpEntity<?> request = new HttpEntity<>(req_payload, headers);
        String url = "http://localhost:8080/xxx/xxx/";

        ResponseEntity<?> response = new RestTemplate().postForEntity(url, request, String.class);
        ServiceResponse entityResponse = (ServiceResponse) response.getBody();
        System.out.println(entityResponse.getData());
    }

}
Piyush Mittal
fonte
7
Esse pedido posts / json em vez de dados do formulário
Maciej Stępyra
ResponseEntity<?> response = new RestTemplate().postForEntity(url, request, String.class);. Eu estou recebendoorg.springframework.http.converter.HttpMessageNotWritableException: Could not write content: No serializer found for class java.util.Collections$3
Shivkumar Mallesappa
você poderia por favor, compartilhe seu programa todo ou deixe-me saber que eu vou compartilhar algumas amostras programa de exemplo @ShivkumarMallesappa
Piyush Mittal
Se você substituir o application/jsontipo de conteúdo, application/x-www-form-urlencodedobterá org.springframework.web.client.RestClientException: No HttpMessageConverter para java.util.HashMap e tipo de conteúdo "application / x-www-form-urlencoded" - consulte stackoverflow.com/q / 31342841/355438
Lu55 6/08/19
-3

Sua String de url precisa de marcadores variáveis ​​para o mapa que você passa para o trabalho, como:

String url = "https://app.example.com/hr/email?{email}";

Ou você pode codificar explicitamente os parâmetros de consulta na String para começar e não precisar passar o mapa, como:

String url = "https://app.example.com/hr/[email protected]";

Consulte também https://stackoverflow.com/a/47045624/1357094

cellepo
fonte