Spring RestTemplate ile form verilerini POST ETME?


149

Aşağıdaki (çalışma) curl snippet'i bir RestTemplate çağrısına dönüştürmek istiyorum:

curl -i -X POST -d "email=first.last@example.com" https://app.example.com/hr/email

E-posta parametresini nasıl doğru şekilde iletirim? Aşağıdaki kod 404 Bulunamadı yanıtı ile sonuçlanır:

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

Map<String, String> params = new HashMap<String, String>();
params.put("email", "first.last@example.com");

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

PostMan doğru çağrı formüle etmeye çalıştım ve vücutta bir "form-veri" parametresi olarak e-posta parametresi belirterek doğru çalışmasını alabilirsiniz. RestTemplate'te bu işlevselliğe ulaşmanın doğru yolu nedir?


RestTemplate.exchange () öğesini deneyin;
Biz Borg

Burada sağladığınız URL'nin kabul edilebilir içerik türü nedir?
Tharsan Sivakumar

Aynı şeyi yapmaya çalışan bu bloga bak sanırım techie-mixture.blogspot.com/2016/07/…
Tharsan Sivakumar

@TharsanSivakumar URL, JSON'u döndürecek.
sim

Yanıtlar:


357

POST yöntemi HTTP istek nesnesi boyunca gönderilmelidir. Ve istek HTTP üstbilgisi veya HTTP gövdesi veya her ikisini içerebilir.

Bu yüzden bir HTTP varlığı oluşturalım ve üstbilgileri ve parametreyi gövde içinde gönderelim.

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

MultiValueMap<String, String> map= new LinkedMultiValueMap<String, String>();
map.add("email", "first.last@example.com");

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. Sınıf-java.lang.Object ...-


1
Daha fazla bilgi için bu bağlantıya da başvurabilirsiniz. Techie-mixture.blogspot.com/2016/07/…
Tharsan Sivakumar

1
Günümü kurtardın , resttemplate kullanmanın oldukça açık olduğunu umuyordum , ama bazı hileler var!
Sergii Getman

1
ResponseEntity<String> response = new RestTemplate().postForEntity(url, request, String.class);Ben alıyorumorg.springframework.http.converter.HttpMessageNotWritableExc‌​eption: Could not write content: No serializer found for class java.util.Collections$3
Shivkumar Mallesappa

Diğerleri Dizelerken body parametresi nasıl iletilir ancak bunlardan biri String [] argscurl -X POST --data '{"file": "/xyz.jar", "className": "my.class.name", "args": ["100"]}' -H "Content-Type: application/json" localhost:1234/batches
türündedir

2
Bu sadece dizeler için çalışıyor ... Ya bir java nesnesini yükte göndermek istersem?
devssh

23

Karışık veriler POST nasıl: Bir istekte Dosya, Dize [], Dize.

Sadece ihtiyacınız olanı kullanabilirsiniz.

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;
}

POST isteği Dosyasında ve bir sonraki yapısında Dosya olacaktır:

POST https://my_url?array=your_value1&array=your_value2&name=bob 

Bu yöntemi denedim ama benim için çalışmadı. Çok parçalı biçimdeki verilerle bir POST isteği yaparken bir sorunla karşılaşıyorum. Bana bir çözüm ile rehberlik edebilirseniz sorum şu. Stackoverflow.com/questions/54429549/…
Deep Lathia

8

İşte Spring'in RestTemplate'ini kullanarak bir POST dinlenme çağrısı yapmak için tam program.

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());
    }

}

7
Bu form verileri yerine uygulama / json yayınlar
Maciej Stępyra

ResponseEntity<?> response = new RestTemplate().postForEntity(url, request, String.class);. Ben alıyorumorg.springframework.http.converter.HttpMessageNotWritableException: Could not write content: No serializer found for class java.util.Collections$3
Shivkumar Mallesappa

tüm programınızı paylaşabilir misiniz veya bazı örnek program paylaşacağımı bana bildirir misiniz @ShivkumarMallesappa
Mittal

Eğer değiştirirseniz application/jsontarafından içerik türünü application/x-www-form-urlencodedelde edersiniz org.springframework.web.client.RestClientException: Hayır HttpMessageConverter java.util.HashMap ve içerik türü için "/ x-www-form-urlencoded uygulama" - bkz stackoverflow.com/q / 31342841/355438
Lu55

-3

URL Dizeniz, çalıştığınız harita için aşağıdaki gibi değişken işaretlere ihtiyaç duyar:

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

Veya sorgu parametrelerini açıkça başlamak için Dize içine kodlayabilir ve haritayı hiç iletmeniz gerekmez:

String url = "https://app.example.com/hr/email?email=first.last@example.com";

Ayrıca bkz. Https://stackoverflow.com/a/47045624/1357094

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.