에서 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 (또는 성공적인 삭제에 적합한 것)
답변
한 가지 옵션은 삭제 “트랜잭션”을 만드는 것입니다. 그래서 당신 POST
은 http://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 API 및 Google 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 메서드에서 의미하는 바를 고려해야합니다.
-
모든 ‘foo’요소를 반환합니다.
[GET] api/foo
-
특정 ID를 필터링하여 ‘foo’요소를 반환합니다.
[GET] api/foo?ids=3,5,9
여기서 의미는 URL과 필터가 “우리가 다루는 요소는 무엇입니까?”를 결정하고 REST 메서드 (이 경우 “GET”)는 “이러한 요소로 무엇을해야합니까?”라고 말합니다.
-
따라서 여러 레코드를 PATCH하여 읽은 것으로 표시합니다.
[PATCH] api/foo?ids=3,5,9
.. 데이터 foo [read] = 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이면 삭제할 본문을 읽습니다.