วิธีการโพสต์ข้อมูลในแบบฟอร์มด้วย Spring RestTemplate


147

ฉันต้องการแปลงตัวอย่างข้อมูล curl (ทำงาน) ต่อไปนี้เป็นการเรียก RestTemplate:

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

ฉันจะส่งพารามิเตอร์อีเมลได้อย่างถูกต้องได้อย่างไร รหัสต่อไปนี้ส่งผลให้เกิดการตอบสนอง 404 ไม่พบ:

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 และฉันสามารถทำให้มันทำงานได้อย่างถูกต้องโดยการระบุพารามิเตอร์อีเมลเป็นพารามิเตอร์ "form-data" ในเนื้อหา วิธีที่ถูกต้องเพื่อให้บรรลุหน้าที่การทำงานนี้ใน RestTemplate คืออะไร?


ลอง restTemplate.exchange ();
เราคือ Borg

ประเภทเนื้อหาที่ยอมรับได้ของ URL ที่คุณให้ไว้ที่นี่คืออะไร
Tharsan Sivakumar

ดูบล็อกนี้ที่พยายามทำสิ่งเดียวกันฉันเดาtechie-mixture.blogspot.com 2016/05/05
Tharsan Sivakumar

@TharsanSivakumar URL จะส่งคืน JSON
sim

สำเนาซ้ำที่เป็นไปได้ของRestTemplate uriVariables ไม่ได้รับการขยาย
cellepo

คำตอบ:


355

ควรส่งเมธอด POST ไปตามวัตถุคำขอ HTTP และคำขออาจมีส่วนหัว HTTP หรือเนื้อหา HTTP หรือทั้งสองอย่าง

ดังนั้นเรามาสร้างเอนทิตี HTTP และส่งส่วนหัวและพารามิเตอร์ในเนื้อหา

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 -Class java.lang.Object ...-


1
คุณสามารถอ้างอิงลิงค์นี้เช่นกันสำหรับข้อมูลเพิ่มเติมtechie-mixture.blogspot.com 2016/05/50
Tharsan Sivakumar

1
คุณบันทึกวันของฉันไว้ฉันคาดว่าการใช้resttemplateนั้นค่อนข้างชัดเจน แต่มีเทคนิคบางอย่าง!
Sergii Getman

1
ResponseEntity<String> response = new RestTemplate().postForEntity(url, request, String.class);ฉันได้รับorg.springframework.http.converter.HttpMessageNotWritableExc‌​eption: Could not write content: No serializer found for class java.util.Collections$3
Shivkumar Mallesappa

วิธีการส่งผ่านพารามิเตอร์ร่างกายเมื่อคนอื่นเป็น Strings แต่หนึ่งในนั้นคือชนิดสตริง [] ดังที่ด้านล่างขอข้อมูลargsเป็นอาร์เรย์ของสตริงcurl -X POST --data '{"file": "/xyz.jar", "className": "my.class.name", "args": ["100"]}' -H "Content-Type: application/json" localhost:1234/batches
khawarizmi

2
ดังนั้นจะใช้งานได้เฉพาะกับสตริง ... ถ้าฉันต้องการส่งวัตถุ java ในส่วนของข้อมูล?
devssh

23

วิธีการโพสต์ข้อมูลแบบผสม: ไฟล์, สตริง [], สตริงในคำขอเดียว

คุณสามารถใช้สิ่งที่คุณต้องการเท่านั้น

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 จะมีไฟล์อยู่ในเนื้อหาและโครงสร้างถัดไป:

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

ฉันลองวิธีนี้ แต่ไม่ได้ผลสำหรับฉัน ฉันกำลังประสบปัญหาในการส่งคำขอ POST ด้วยข้อมูลในรูปแบบหลายส่วน นี่คือคำถามของฉันหากคุณสามารถให้คำแนะนำฉันด้วยstackoverflow.com/questions/54429549/
Deep Lathia

8

นี่คือโปรแกรมเต็มรูปแบบในการโทรหา POST โดยใช้ RestTemplate ของ 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
โพสต์แอปพลิเคชัน / json แทนข้อมูลในแบบฟอร์ม
Maciej Stępyra

ResponseEntity<?> response = new RestTemplate().postForEntity(url, request, String.class);. ฉันได้รับorg.springframework.http.converter.HttpMessageNotWritableException: Could not write content: No serializer found for class java.util.Collections$3
Shivkumar Mallesappa

คุณช่วยแบ่งปันโปรแกรมทั้งหมดของคุณหรือแจ้งให้เราทราบได้ฉันจะแชร์โปรแกรมตัวอย่างบางส่วน @ShivkumarMallesappa
Piyush Mittal

หากคุณแทนที่application/jsonประเภทเนื้อหาโดยapplication/x-www-form-urlencodedคุณจะได้รับorg.springframework.web.client.RestClientException: ไม่ HttpMessageConverter สำหรับ java.util.HashMap และประเภทเนื้อหา "application / x-www-form-urlencoded" - ดูstackoverflow.com/q / 31342841/355438
Lu55

-3

สตริง URL ของคุณต้องการเครื่องหมายตัวแปรสำหรับแผนที่ที่คุณผ่านการทำงานเช่น:

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

หรือคุณสามารถเขียนรหัสพารามิเตอร์ Params ลงใน String เพื่อเริ่มต้นด้วยและไม่ต้องผ่านแผนที่เลยเช่น:

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

ดูเพิ่มเติมที่https://stackoverflow.com/a/47045624/1357094

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.