복붙노트

[SPRING] Transfer-Encoding 제거 : POST 요청에 청크가 있습니까?

SPRING

Transfer-Encoding 제거 : POST 요청에 청크가 있습니까?

다음 코드를 사용하여 POST 요청을 보내 겠지만 요청은 청크 분할 (전송 인코딩 : 청크 분할) 형식으로 전송됩니다. 나는이 문제에 대해 봤지만 Content-Length를 포함한다고 말하고 있지만 아래 코드에서는 어떻게 Content-Length를 설정할 수 있는지 알 수 없었다.

@RequestMapping(value = "/contacts", method = RequestMethod.POST)
public Map<String, ContactInfo> addContactInfo(
                                @RequestBody Map<String, ContactInfo> ContactInfoDto) {

    ContactInfo contactInfo = ContactInfoDto.get("contact");
    if (contactInfo == null) {
        throw new IllegalArgumentException("Contact not found.");
    }

    contactInfo = this.contactInfoManager.addNew(contactInfo);
    Map<String, ContactInfo> map = new HashMap<>();
    map.put("contact", contactInfo);

    return map;

}

해결법

  1. ==============================

    1.ResponseEntity를 사용하여 헤더를 명시 적으로 설정할 수 있습니다. 까다로운 점은 콘텐츠의 실제 길이를 알아내는 것입니다.

    ResponseEntity를 사용하여 헤더를 명시 적으로 설정할 수 있습니다. 까다로운 점은 콘텐츠의 실제 길이를 알아내는 것입니다.

    @RequestMapping(value = "/contacts", method = RequestMethod.POST)
    public ResponseEntity<Map<String, ContactInfo>> addContactInfo(@RequestBody Map<String, ContactInfo> contactInfoDto) throws JsonProcessingException {
    
        ContactInfo contactInfo = contactInfoDto.get("contact");
        if (contactInfo == null) {
            throw new IllegalArgumentException("Contact not found.");
        }
    
        contactInfo = this.contactInfoManager.addNew(contactInfo);
        Map<String, ContactInfo> map = new HashMap<>();
        map.put("contact", contactInfo);
    
        HttpHeaders headers = new HttpHeaders();
        headers.set(HttpHeaders.CONTENT_LENGTH, String.valueOf(new ObjectMapper().writeValueAsString(map).length()));
        return new ResponseEntity<Map<String, ContactInfo>>(map, headers, HttpStatus.CREATED);
    }
    

    테스트:

    $ curl -v http://localhost:8080/contacts/ -X POST -d '{ "contact": { "name": "foo" } }' -H 'Content-Type: application/json' && echo
    *   Trying ::1...
    * Connected to localhost (::1) port 8080 (#0)
    > POST /contacts/ HTTP/1.1
    > Host: localhost:8080
    > User-Agent: curl/7.43.0
    > Accept: */*
    > Content-Type: application/json
    > Content-Length: 32
    > 
    * upload completely sent off: 32 out of 32 bytes
    < HTTP/1.1 201 Created
    < Server: Apache-Coyote/1.1
    < X-Application-Context: application
    < Content-Type: application/json;charset=UTF-8
    < Content-Length: 26
    < Date: Fri, 10 Jun 2016 13:24:23 GMT
    < 
    * Connection #0 to host localhost left intact
    {"contact":{"name":"foo"}}
    
  2. ==============================

    2.다음 코드는 :

    다음 코드는 :

    @RequestMapping(value = "/contacts", method = RequestMethod.POST)
    public Map<String, ContactInfo> addContactInfo(
                                    @RequestBody Map<String, ContactInfo> ContactInfoDto,    
                                    @RequestHeader(value = HttpHeaders.CONTENT_LENGTH, required = true) Long contentLength
    ) { ... }
    

    Content-Length 헤더를 전송하는 데 사용할 수 있습니다. 요청을 보내는 코드에이 헤더를 추가해야한다는 점에 유의하십시오 (클라이언트의 대부분은 자동으로 수행하지만 더 나은 검사를 수행함)

  3. from https://stackoverflow.com/questions/35200216/remove-transfer-encodingchunked-in-the-post-request by cc-by-sa and MIT license