programing

스프링 REST 및 PATCH 방법

telebox 2023. 7. 21. 21:32
반응형

스프링 REST 및 PATCH 방법

SpringBoot과 Spring REST를 사용하고 있습니다.내 모델의 속성을 업데이트하기 위한 HTTP PATCH 방법을 알고 싶습니다.

작동하는 방법을 설명하는 좋은 튜토리얼이 있습니까?

  • 전송할 HTTP PATCH 메서드 및 본문
  • 컨트롤러 방법 및 업데이트 작업 관리 방법

제공된 답변 중 많은 부분이 JSON 패치 적용 또는 불완전한 답변임을 알게 되었습니다.아래는 실제 코드를 작동할 때 필요한 사항에 대한 전체 설명과 예입니다.

첫째, PATCH는 선택적 PUT입니다.개체 또는 개체 목록에 대한 필드를 여러 개 업데이트하는 데 사용합니다.PUT에서는 일반적으로 업데이트와 함께 전체 개체를 보냅니다.

패치/객체/7

{
   "objId":7,
   "objName": "New name"
}

PUT/객체/7

{
   "objId":7,
   "objName": "New name",
   "objectUpdates": true,
   "objectStatus": "ongoing",
   "scoring": null,
   "objectChildren":[
       {
          "childId": 1
       },
     ............ 
}

이렇게 하면 대량의 엔드포인트 없이 레코드를 업데이트할 수 있습니다.예를 들어 위의 경우 점수를 업데이트하려면 object/{id}/scoring이 필요하고 이름을 업데이트하려면 object/{id}/name이 필요합니다.문자 그대로 모든 항목에 대해 하나의 끝점을 사용하거나 모든 업데이트에 대해 전체 개체를 게시하려면 프런트 엔드가 필요합니다.큰 개체가 있는 경우 불필요한 네트워크 시간이나 모바일 데이터가 많이 소요될 수 있습니다.이 패치를 사용하면 모바일 플랫폼에서 사용해야 하는 최소 개체 속성 전송으로 하나의 끝점을 사용할 수 있습니다.

다음은 패치에 대한 실제 사용의 예입니다.

@ApiOperation(value = "Patch an existing claim with partial update")
@RequestMapping(value = CLAIMS_V1 + "/{claimId}", method = RequestMethod.PATCH)
ResponseEntity<Claim> patchClaim(@PathVariable Long claimId, @RequestBody Map<String, Object> fields) {

    // Sanitize and validate the data
    if (claimId <= 0 || fields == null || fields.isEmpty() || !fields.get("claimId").equals(claimId)){
        return new ResponseEntity<>(HttpStatus.BAD_REQUEST); // 400 Invalid claim object received or invalid id or id does not match object
    }

    Claim claim = claimService.get(claimId);

    // Does the object exist?
    if( claim == null){
        return new ResponseEntity<>(HttpStatus.NOT_FOUND); // 404 Claim object does not exist
    }

    // Remove id from request, we don't ever want to change the id.
    // This is not necessary, you can just do it to save time on the reflection
    // loop used below since we checked the id above
    fields.remove("claimId");

    fields.forEach((k, v) -> {
        // use reflection to get field k on object and set it to value v
        // Change Claim.class to whatver your object is: Object.class
        Field field = ReflectionUtils.findField(Claim.class, k); // find field in the object class
        field.setAccessible(true); 
        ReflectionUtils.setField(field, claim, v); // set given field for defined object to value V
    });

    claimService.saveOrUpdate(claim);
    return new ResponseEntity<>(claim, HttpStatus.OK);
}

새로운 개발자들은 일반적으로 그러한 반사를 다루지 않기 때문에 위의 사항들은 일부 사람들에게 혼란스러울 수 있습니다.기본적으로 본문에서 이 함수를 전달하는 경우 지정된 ID를 사용하여 관련 클레임을 찾은 다음 키 값 쌍으로 전달된 필드만 업데이트합니다.

예제 본문:

패치 / 클레임/7

{
   "claimId":7,
   "claimTypeId": 1,
   "claimStatus": null
}

위의 내용이 클레임을 업데이트합니다.클레임 7에 대해 지정된 값에 Id 및 claimStatus를 입력합니다. 다른 모든 값은 그대로 둡니다.

따라서 수익은 다음과 같습니다.

{
   "claimId": 7,
   "claimSrcAcctId": 12345678,
   "claimTypeId": 1,
   "claimDescription": "The vehicle is damaged beyond repair",
   "claimDateSubmitted": "2019-01-11 17:43:43",
   "claimStatus": null,
   "claimDateUpdated": "2019-04-09 13:43:07",
   "claimAcctAddress": "123 Sesame St, Charlotte, NC 28282",
   "claimContactName": "Steve Smith",
   "claimContactPhone": "777-555-1111",
   "claimContactEmail": "steve.smith@domain.com",
   "claimWitness": true,
   "claimWitnessFirstName": "Stan",
   "claimWitnessLastName": "Smith",
   "claimWitnessPhone": "777-777-7777",
   "claimDate": "2019-01-11 17:43:43",
   "claimDateEnd": "2019-01-11 12:43:43",
   "claimInvestigation": null,
   "scoring": null
}

보시다시피, 전체 개체는 변경하려는 데이터 이외의 데이터를 변경하지 않고 반환됩니다.여기에 설명이 반복되는 부분이 있다는 것을 알고 있습니다, 저는 단지 그것을 명확하게 설명하고 싶었습니다.

에서 본질적으로 다른 것은 없습니다.PATCH봄에 관한 한의 방법.PUT그리고.POST문제는 PATCH 요청에서 전달하는 내용과 컨트롤러에서 데이터를 매핑하는 방법입니다.다음을 사용하여 값 빈에 매핑하는 경우@RequestBody실제로 설정된 값과 null 값이 무엇을 의미하는지 파악해야 합니다.은 제한입니다.PATCH을 url로 .Map참고 항목Spring MVC PATCH 방법: 부분 업데이트

-을 사용하여 정지 템플릿을 만듭니다.

import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;

RestTemplate rest = new RestTemplate(new HttpComponentsClientHttpRequestFactory());
now make the PATCH call
        ResponseEntity<Map<String, Object>> response = rest.exchange(api, HttpMethod.PATCH, request, 
            responseType);

언급URL : https://stackoverflow.com/questions/29988841/spring-rest-and-patch-method

반응형