Làm cách nào để POST dữ liệu biểu mẫu với Spring RestTemplate?


146

Tôi muốn chuyển đoạn mã curl (đang hoạt động) sau thành cuộc gọi RestTemplate:

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

Làm thế nào để tôi vượt qua tham số email chính xác? Đoạn mã sau dẫn đến phản hồi 404 Không tìm thấy:

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

Tôi đã cố gắng thực hiện cuộc gọi chính xác trong PostMan và tôi có thể khiến nó hoạt động chính xác bằng cách chỉ định tham số email là tham số "dữ liệu biểu mẫu" trong phần thân. Cách chính xác để đạt được chức năng này trong RestTemplate là gì?


Hãy thử restTemplate.exchange ();
Chúng tôi là Borg

Loại nội dung có thể chấp nhận của url bạn đã cung cấp ở đây là gì?
Tharsan Sivakumar

Nhìn vào blog này đang cố gắng làm điều tương tự tôi đoán techie-mixture.blogspot.com/2016/07/ Kẻ
Tharsan Sivakumar

@TharsanSivakumar Url sẽ trả về JSON.
sim

Câu trả lời:


355

Phương thức POST phải được gửi dọc theo đối tượng yêu cầu HTTP. Và yêu cầu có thể chứa một trong hai tiêu đề HTTP hoặc phần thân HTTP hoặc cả hai.

Do đó, hãy tạo một thực thể HTTP và gửi các tiêu đề và tham số trong phần thân.

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/civerse/javadoc-api/org/springframework/web/client/RestTemplate.html#postForObject-java.lang.String-java.lang.Object-java.lang. Lớp-java.lang.Object ...-


1
Bạn cũng có thể tham khảo liên kết này để biết thêm thông tin techie-mixture.blogspot.com/2016/07/ trên
Tharsan Sivakumar

1
Bạn đã lưu ngày của tôi, tôi dự đoán rằng việc sử dụng resttemplate là khá rõ ràng, nhưng có một số thủ thuật!
Sergii Getman

1
ResponseEntity<String> response = new RestTemplate().postForEntity(url, request, String.class);Tôi đang nhận đượcorg.springframework.http.converter.HttpMessageNotWritableExc‌​eption: Could not write content: No serializer found for class java.util.Collections$3
Shivkumar Mallesappa

Cách truyền tham số cơ thể khi các chuỗi khác là Chuỗi nhưng một trong số chúng thuộc loại Chuỗi [], vì trong dữ liệu yêu cầu bên dưới argslà một mảng của Chuỗicurl -X POST --data '{"file": "/xyz.jar", "className": "my.class.name", "args": ["100"]}' -H "Content-Type: application/json" localhost:1234/batches
khawarizmi 22/03/18

2
Vì vậy, điều này chỉ hoạt động cho các chuỗi ... Điều gì xảy ra nếu tôi muốn gửi một đối tượng java trong tải trọng?
devssh

23

Cách POST dữ liệu hỗn hợp: File, String [], String trong một yêu cầu.

Bạn chỉ có thể sử dụng những gì bạn cần.

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

Yêu cầu POST sẽ có Tệp trong Phần thân và cấu trúc tiếp theo:

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

Tôi đã thử phương pháp này nhưng không hiệu quả với tôi. Tôi đang đối mặt với một vấn đề khi thực hiện một yêu cầu POST với dữ liệu ở định dạng nhiều phần. Đây là câu hỏi của tôi nếu bạn có thể hướng dẫn tôi một giải pháp stackoverflow.com/questions/54429549/
Khăn

8

đây là chương trình đầy đủ để thực hiện cuộc gọi nghỉ ngơi POST bằng cách sử dụng RestTemplate của spring.

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
Đó là đăng ứng dụng / json thay vì dữ liệu biểu mẫu
Maciej Stpyra

ResponseEntity<?> response = new RestTemplate().postForEntity(url, request, String.class);. Tôi đang nhận đượcorg.springframework.http.converter.HttpMessageNotWritableException: Could not write content: No serializer found for class java.util.Collections$3
Shivkumar Mallesappa

bạn có thể vui lòng chia sẻ toàn bộ chương trình của bạn hoặc cho tôi biết tôi sẽ chia sẻ một số chương trình mẫu @ShivkumarMallesappa
Piyush Mittal

Nếu bạn thay thế application/jsonloại nội dung bằng cách application/x-www-form-urlencodedbạn sẽ nhận được org.springframework.web.client.RestClientException: Không có HTTPMessageConverter cho java.util.HashMap và loại nội dung "application / x-www-form-urlencoding" - xem stackoverflow.com/q / 31342841/35538
Lu55

-3

Chuỗi url của bạn cần các điểm đánh dấu biến cho bản đồ bạn vượt qua để làm việc, như:

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

Hoặc bạn có thể mã hóa rõ ràng các tham số truy vấn vào Chuỗi để bắt đầu và hoàn toàn không phải vượt qua bản đồ, như:

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

Xem thêm https://stackoverflow.com/a/47045624/1357094

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.