2011-06-11 5 views
1

나는 과 같은 웹 서비스를 호출 할 수 있으며 넣기 및 삭제 방법을 사용할 수 없습니까? 정말 REST 웹 서비스입니까?왜 REST (전체) 웹 서비스에 넣고 삭제해야합니까?

.... 
$url = 'webservice.php'; 
$data = array(
    'username' => 'a', 
    'password' => 'a', 
    'param1'=> 'param1', 
    'operation'=> 'delete', 
    'output'=>'xml' 
); 
$client = curl_init($url); 
curl_setopt($client, CURLOPT_POST,1); 
.... 

...................

//webservice.php 
$operation=$_POST['operation']; 
$param1=$_POST['param1']; 
if ($operation=='delete') 
{ 
$r=mysql("delete from list where id='$param1'"); 
} 
if ($operation=='insert') 
{ 
$r=mysql("insert into list values ('$param1')"); 
} 
..... 
+0

이것은 Programmers.SE에 속하지 않으십니까? –

+2

나는 Programmers.SE를 모른다. – user677900

답변

3

이 기술은 일반적인 POST 작업의 본문에 실제 작업을 묻어주기 때문에 "tunneling"이라고도합니다. 제 의견으로는 일종의 해킹이며 REST의 목적에 어긋나지 만 웹 호스트가 필수 HTTP 동사를 허용하지 않는 경우 가끔 필요합니다.

그들은 표준 동사와 understanding the implications을 사용하여 서비스를 간과해서는 안되는 REST의 중요한 측면입니다. 예를 들어, 동일한 자원에서 DELETE 조작을 반복적으로 발행 할 수 있어야하며, 이는 결과 (멱등 원)가있는 첫 x 째 DELETE 만 가져야합니다. GET을 사용하면 서버 (안전)에 변경이 없다고 가정해야합니다. 그러나 POST 내부에서 작업을 숨기면 그 작업이 모호해집니다.

+0

삭제를 위해 delete.php를 호출하고 삽입을 위해 insert.php를 호출하면 어떻게 될까요? – user677900

+1

@ a.v : 그게 더 좋지만, 요청 유형 (예 : DELETE 요청)보다는 리소스 이름에 동사 (수행되는 동작)를 넣습니다. @ 존 아인슈타인 (John Einstein)이 말했듯이 (때로는 시스템에 HTTP 사양에 구현 된 것보다 더 많은 동사가있는 경우) 가끔 필요합니다. 그러나 직접적인 경우에는 리소스 (URL), 동작 (HTTP 동사) 및 매개 변수 (쿼리 문자열 또는 POST 값). – David

+0

@ a.v : 그것이 REST가 아닙니다. 이는 REST 규칙 대신 자신 만의 규칙을 고안한다는 의미입니다. – Josh

3

이 정말 RESTful 서비스가 아닙니다. RESTful이되도록 모든 HTTP 동사를 구현할 필요는 없지만 POST를 사용하여 데이터를 삭제하면 안됩니다.

개인적으로 항목을 제거하기 위해 DELETE를 구현하고 데이터를 삽입하기 위해 POST 만 사용합니다.

4

REST의 주요 아이디어 중 하나는 인수 (이 경우 'operation'매개 변수)의 일부로 조작 방법을 제공하지 않는 것입니다.

대신 각 리소스에는 고유 한 URL이 있으며 HTTP 동사 (GET, POST, PUT 또는 DELETE)가 해당 리소스에 사용됩니다.

귀하의 접근 방법은 RESTful이 아닙니다.

예 : 그들은 (당신의 예에서와 같이) 대해 수행 할 작업을 결정하는 '방법'매개 변수를 사용하는 방법

GET /services/rest/?method=flickr.photos.comments.deleteComment&comment_id=28 

참고 :

플리커 API를 사용하여 댓글을 삭제.

평온한 구현 같은 것을 받아 들일 :이 경우

DELETE /comment/28 

가장 좋은 방법은, 새로운 자원을 생성하기위한 POST를 사용하여 그들을 제거하기 위해 삭제하는 것을, 기존 및 PUT하는 기존 업데이트 할 검색하는 GET.

+0

내 코드가 웹 서비스에 유용합니까? 위험이 있습니까? – user677900

+0

No. 1) 인증 없음 및 2) 사용자 입력 필터가 없습니다. 최소한 mysql_real_escape_string을 사용하십시오. –

+0

감사합니다. 이것은 샘플 코드입니다. 인증 및 입력 필터링이 있습니다. 나는 delete.php를 delete로 호출하거나 webservice.php에 delete 매개 변수를 보내는 것이 좋은가요? – user677900

2

나는 여기에 밀려서 PUT 및 DELETE없이 RESTful 서비스를 만드는 것이 완벽하다고 말한다. 당신이 알고 있어야 할 유일한 핵심은 그렇게하는 것을 포기하는 것입니다.

1) 중개 구성 요소 (예 : 프록시, 캐시,로드 밸런서)는 리소스 작성/업데이트 또는 삭제 여부를 알 수 없으므로 작업이 안전한지 (GET) 또는 안전하지 않은지 (POST) 알 수 있습니다. 내 질문은이 지식을 이용하는 중개 구성 요소에 대해 알고 있습니까?

2) 서비스에 액세스하려는 프로그래머는 리소스를 삭제하는 방법을 추측 할 수 없으므로 링크 관계가있는 링크를 포함시켜야합니다.이 링크에는 프로그래머에게 설명하는 설명서가 있습니다 삭제를 수행하려면 링크의 URI에 POST해야합니다. 클라이언트 개발자에게는 좀 더 많은 작업이 있지만 적어도 수행 방법에 대해 명시 적으로 설명하고 있습니다.

내가 망각에 빠지기 전에, Roy Fielding의 말에 누가 괜찮습니까? 어떤 경우

는 GET과 POST하지만 아무것도하지 않고 편안하고 서비스의 많음이있다. 중요한 것은 해당 메서드가 사용되는 방법이 아니라 메서드가 사용되는 방법이 아니라는 것입니다. 구체적인 예를 들면, 은 위키가 어느 정도 RESTful이되는지를 거의 항상 (ab)가 GET 및 세션을 사용하여 결정하는 방식으로 결정합니다. 페이지를 편집하기 위해 PUT 또는 POST를 사용하는지 여부를 비교하여 설탕 토핑입니다.

http://code.google.com/p/implementing-rest/wiki/FAQ

은 하나의 자원이라는 webservice.php을 작성하고 REST의 관점에서 불쾌한 디자인 냄새는 "조작"매개 변수입니다 통과,이 모든 것을 가졌어요.

관련 문제