[rest] 많은 항목을 삭제하는 편안한 방법

에서 REST에 대한 위키 기사
당신이 사용하는 경우 지적한다 http://example.com/resources 수단은 전체 컬렉션을 삭제하는 것을 삭제합니다.

http://example.com/resources/7HOU57Y DELETE 를 사용하는 경우 해당 요소를 삭제하는 것입니다.

웹 사이트를하고 있는데 웹 서비스가 아닙니다.

목록의 각 항목에 대해 1 개의 확인란이있는 목록이 있습니다. 삭제할 항목을 여러 개 선택하면 사용자가 DELETE SELECTION이라는 버튼을 누를 수 있습니다. 사용자가 버튼을 누르면 js 대화 상자가 팝업되어 사용자에게 삭제를 확인합니다. 사용자가 확인하면 모든 항목이 삭제됩니다.

그렇다면 RESTFUL 방식으로 여러 항목을 삭제하려면 어떻게해야합니까?

참고, 현재 웹 페이지에서 DELETE의 경우 POST와 함께 FORM 태그를 작업으로 사용하지만 DELETE 값이있는 _method를 포함하는 것입니다. 이것은 웹 페이지에 대한 RESTful 삭제를 수행하는 방법에 대해 SO에서 다른 사람들이 표시 한 것입니다 .



답변

지금까지로 조카의 대답 이 최고 라고 생각 합니다. 약간의 변형은 동일한 페이지에서 자바 스크립트 확인을 없애고 대신 선택 항목을 만들고 리디렉션하여 해당 페이지에 확인 메시지를 표시하는 것입니다. 다시 말해:

출처 :
http://example.com/resources/

~을하다

선택한 ID로 POST :
http://example.com/resources/selections

성공하면 다음과 같이 응답해야합니다.

HTTP / 1.1 201 생성 및 위치 헤더 :
http://example.com/resources/selections/DF4XY7

이 페이지에 (자바 스크립트) 확인 상자가 표시됩니다. 확인하면 다음을 요청합니다.

http://example.com/resources/selections/DF4XY7 삭제

성공하면 다음과 같이 응답해야합니다. HTTP / 1.1 200 Ok (또는 성공적인 삭제에 적합한 것)


답변

한 가지 옵션은 삭제 “트랜잭션”을 만드는 것입니다. 그래서 당신 POSThttp://example.com/resources/deletes삭제할 자원 목록으로 구성된 새로운 자원 과 같은 것 입니다. 그런 다음 응용 프로그램에서 삭제를 수행하십시오. 게시를 할 때 생성 된 거래의 위치 (예 : http://example.com/resources/deletes/DF4XY7. 이에 대한 A GET는 트랜잭션의 상태 (완료 또는 진행 중) 및 / 또는 삭제할 리소스 목록을 반환 할 수 있습니다.


답변

Amazon이 S3 REST API로 수행 한 작업은 다음과 같습니다.

개별 삭제 요청 :

DELETE /ObjectName HTTP/1.1
Host: BucketName.s3.amazonaws.com
Date: date
Content-Length: length
Authorization: authorization string (see Authenticating Requests (AWS Signature Version 4))

다중 객체 삭제 요청 :

POST /?delete HTTP/1.1
Host: bucketname.s3.amazonaws.com
Authorization: authorization string
Content-Length: Size
Content-MD5: MD5

<?xml version="1.0" encoding="UTF-8"?>
<Delete>
    <Quiet>true</Quiet>
    <Object>
         <Key>Key</Key>
         <VersionId>VersionId</VersionId>
    </Object>
    <Object>
         <Key>Key</Key>
    </Object>
    ...
</Delete>

그러나 Facebook Graph API , Parse Server REST APIGoogle Drive REST API 는 한 번의 요청으로 개별 작업을 “일괄 처리”할 수 있도록함으로써 훨씬 더 나아갑니다.

다음은 Parse Server의 예입니다.

개별 삭제 요청 :

curl -X DELETE \
  -H "X-Parse-Application-Id: ${APPLICATION_ID}" \
  -H "X-Parse-REST-API-Key: ${REST_API_KEY}" \
  https://api.parse.com/1/classes/GameScore/Ed1nuqPvcm

일괄 요청 :

curl -X POST \
  -H "X-Parse-Application-Id: ${APPLICATION_ID}" \
  -H "X-Parse-REST-API-Key: ${REST_API_KEY}" \
  -H "Content-Type: application/json" \
  -d '{
        "requests": [
          {
            "method": "POST",
            "path": "/1/classes/GameScore",
            "body": {
              "score": 1337,
              "playerName": "Sean Plott"
            }
          },
          {
            "method": "POST",
            "path": "/1/classes/GameScore",
            "body": {
              "score": 1338,
              "playerName": "ZeroCool"
            }
          }
        ]
      }' \
  https://api.parse.com/1/batch


답변

DELETE http://example.com/resources/id1,id2,id3,id4 또는 DELETE http://example.com/resources/id1+id2+id3+id4 라고 말합니다 . 이 위키피디아 기사를 인용하는 “REST는 아키텍처 (…) [아님] 프로토콜”이므로이를 수행하는 단일 방법이 없다고 생각합니다.

HTML을 사용하는 JS 없이는 위의 작업이 불가능하다는 것을 알고 있지만 REST가 다음과 같은 느낌을받습니다.

  • 거래와 같은 사소한 세부 사항을 생각하지 않고 만들어졌습니다. 누가 더 많은 단일 항목을 조작해야합니까? 이것은 정적 웹 페이지 이외의 다른 것을 통해 제공하도록 의도되지 않았기 때문에 HTTP 프로토콜에서 정당화됩니다.
  • 순수한 HTML 일지라도 현재 모델로 잘 조정할 필요는 없습니다.


답변

흥미롭게도 여러 엔터티를 PATCH하는 것과 동일한 방법이 적용되며 URL, 매개 변수 및 REST 메서드에서 의미하는 바를 고려해야합니다.

  1. 모든 ‘foo’요소를 반환합니다.

    [GET] api/foo

  2. 특정 ID를 필터링하여 ‘foo’요소를 반환합니다.

    [GET] api/foo?ids=3,5,9

여기서 의미는 URL과 필터가 “우리가 다루는 요소는 무엇입니까?”를 결정하고 REST 메서드 (이 경우 “GET”)는 “이러한 요소로 무엇을해야합니까?”라고 말합니다.

  1. 따라서 여러 레코드를 PATCH하여 읽은 것으로 표시합니다.

    [PATCH] api/foo?ids=3,5,9

.. 데이터 foo [read] = 1

  1. 마지막으로 여러 레코드를 삭제하려면이 끝 점이 가장 논리적입니다.

    [DELETE] api/foo?ids=3,5,9

나는 이것에 대해 어떤 “규칙”이 있다고 믿지 않는다는 것을 이해하십시오.


답변

으로 점잖은 물장난 응답rojocas 대답은 말한다, 가장 표준적인 자원의 선택을 삭제하는 가상 리소스를 사용하지만, 난을 실행하는 것이 있기 때문에 그하는 REST 관점에서 잘못 생각하는 DELETE http://example.com/resources/selections/DF4XY7선택의 자원 자체가 아니라 선택된 자원을 제거해야합니다.

복용 마치에이 Piechotka의 anwser 또는 fezfox 응답을 , 난 단지 이의가 :이 ID의 배열을 전달보다 표준 방법, 그리고 배열 연산자를 사용하고 있습니다 :

DELETE /api/resources?ids[]=1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d&ids[]=7e8f9a0b-1c2d-3e4f-5a6b-7c8d9e0f1a2b

이런 식으로 컬렉션 삭제 끝점을 공격하지만 올바른 방법으로 쿼리 문자열을 사용하여 삭제를 필터링합니다.


답변

이를 수행하는 ‘적절한’방법이 없기 때문에 내가 과거에 한 일은 다음과 같습니다.

http://example.com/something에 DELETE를 보냅니다 .본문에 xml 또는 json으로 인코딩 된 데이터와 함께 으로 보냅니다.

요청을 받으면 DELETE를 확인하고 true이면 삭제할 본문을 읽습니다.