PHP와 REST API를 만들기

그물을 휩쓴 최신 (종류의) crazes 중 하나는 더 구체적으로 API를, 저 그 활용 REST입니다. 소비 REST API를 너무 놀라울 정도로 쉽게 ... 모든 언어에서와 같이 그것은 역시 정말 놀랄 없습니다. 당신은 본질적으로 세 이상 지속되어 왔으나, HTTP 사양보다 더 아무것도 사용하지대로 그들을 만들어도 매우 간단합니다. 제가 누구를 위해 레일 크레딧을주는 몇 가지 중 하나는 이러한 API를 제공하고 소비를위한 모두의 잘 생각 아웃 REST 지원, (그것은 같이 일하는 모든 레일의 fanboys에 의해 설명되지대로)입니다.

진짜로, 당신은 REST를 사용한 적이 있지만, 지금까지 SOAP API (또는 생성, 악화)에서 작동하도록했습니다 적이있다면, 또는 단순히 오픈 WSDL을 하고 머리가 폭발했다, 소년 난 당신을 위해 좋은 소식이 없어!

그럼, 나머지는 지구에 무엇입니까? 왜 상관해야할까요?

우리가 몇 가지 코드를 작성에 들어가기 전에, 어떻게 나머지는 무엇이며 어떻게 그것의 위대한 API 용으로 모두가 잘 이해하고있어 확실히하고 싶습니다. 첫째, 또다른 분신 API는 특정 아니라, 그것은 일반적인 개념이 더 있어요. 그러나 분명,이 문서의를 위해 우리는 API의 맥락에서 그것에 대해 얘기됩니다. 자,이 API의 기본적인 욕구에서하는 방법과 나머지는 그들을 해결할 보겠습니다.

요청
모든 API는 요청을 수락해야합니다. 일반적으로 편리한 API로, 당신은 잘 정의된 URL 구성표를 가지고 있습니다. 자, 당신은 귀하의 사이트에 (나도 알아, 난 항상 내 예제에 대해 "사용자"개념을 사용하여) 사용자를위한 API를 제공하고자 말한다. 음, 귀하의 URL 구조는 아마 비슷한가 될 것 "API / 사용자 '와'API / 사용자 / [ID]"는 API에 대해 요청되는 작업의 종류에 따라. 당신은 또한 당신이 데이터를 받아들이는 방법을 고려해야합니다. 요즘 많은 사람들이 JSON 또는 XML을 사용하고 있으며, 그것이 Java 스크립트와 함께 잘 작동하고, PHP는 인코딩 및 디코딩 거기에 쉽게 기능을 가지고 있기 때문에 개인적으로 JSON을 선호합니다. 정말로 강력한 것으로는 API를 원한다면, 당신은 요청 (예 : 응용 프로그램 / JSON 또는 응용 프로그램 / XML)의 콘텐츠 유형을 도청함으로써 모두를 받아들일 수 있지만 하나의 콘텐츠 유형에 물건을 제한할 수 있도록 완벽하게 받아들일 수있어. 당신이 원한다면 제기랄, 당신도 간단한 키 / 값 쌍을 사용할 수 있습니다.

요청의 다른 조각이 실제로 일반적으로 저장과 같은 부하로, 등등을 의미하는 것 무엇, 당신은 요청자 (소비자) 욕구 어떤 동작을 정의하는 아키텍처의 일종를 정해야 해 싶지만, 나머지 부분은 단순화 그. HTTP 요청 방법, 또는 동사를 사용함으로써, 우리는 아무것도 정의하지 않아도됩니다. 우리는 단지, GET POST, 놓고, 방법을 삭제를 사용할 수 있습니다, 그래서 우리가 필요한 것 모든 요청을 다룹니다. 당신은 표준 crud 스타일을 떠벌 동사를 동일시 수 = 남자좀 / 검색, POST = 넣어 만드는 = 업데이트, DELETE = 뭐, 삭제할 수 있습니다. 이것이 동사가 직접 CRUD로 번역하지 않습니다하는 것이 중요하지만, 그들에 대해 생각하는 좋은 방법입니다. 그래서, 위의 URL을 예제로 돌아가는, 그럼 몇 가지 요청이 어떤 의미인지 살펴 보자 :

  • / API / 사용자가 GET 요청 - 모든 사용자리스트
  • 1 ID를 가진 사용자에 대한 목록 정보 - 요청에 / api/users/1을 해드
  • / API / 사용자에게 요청을 게시할 - 새 사용자 만들기
  • 1 ID로 업데이트 사용자 - 요청에 / api/users/1 올려
  • 1 ID를 삭제 사용자 -에게 / api/users/1 요청을 삭제

당신이 잘하면시피, REST는 이미 몇 가지 간단한 잘 이해 표준 및 프로토콜을 통해 자신의 API를 만드는 주요 두통이 많이 돌봐했지만 좋은 API를 한 다른 쓰레기가 있어요 ...

응답
그럼, 나머지는 쉽게 요청을 처리뿐만 아니라 생성하는 반응을하기가 쉽습니다. 응답 본문 및 상태 코드 : 요청과 마찬가지로, 두 가지 주요 편리한 반응의 구성 요소가 없습니다. 응답 본문이 다루기 매우 쉽습니다. 요청과 마찬가지로, 나머지 대부분의 반응은 일반적으로 JSON 또는 XML 중 하나입니다 (아마 게시물의 경우 그냥 일반 텍스트하지만 그건 나중에 맡을 게요). 그리고, 요청 마찬가지로 소비자들은 HTTP 요청 사양의 다른 부분을 통해, "동의"하려는 응답 유형을 지정할 수 있습니다. 소비자가 XML 응답을 수신하고자한다면, 그들은 단지이 ( ": 응용 프로그램 / XML 동의합니다")와 같은 굳은 그들의 요청의 일부로 헤더를 수락 보내 드릴께요. 보다시피,이 방법은 널리 (tho 그것이 있어야 함)을 채택하므로 또한 URL의 확장 개념을 사용하지 않습니다. 예를 들어, / API / users.xml는 소비자 반응과 같은 XML을 바라는 의미 비슷하게 / API / users.json는 JSON을 (/ api/users/1.json/xml 같은 것들에 대한 동일) 의미합니다. 여러분의 선택에 어느 쪽이든 (나는 둘다고한다면), 당신은 사람들이 '도 그들이 원하는 것을 말해 실거예요 많은 시간으로 기본 응답 유형을 선택합니다. 다시, 나는 JSON로 가야한다는 것. 따라서 머리글이나 확장자 (예 : / API / 사용자) 단지 실패 - 이상해야 실패하지 말아야 기본 응답 형태로 수락 없습니다.

그런데 오류 및 요청과 관련된 다른 중요한 상태 메시지는? 진정해, HTTP 상태 코드를 사용! 이것은 지금까지 이상의 편리한 API를 만드는 방법에 대해 내가 가장 좋아하는 것들 중 하나입니다. HTTP 상태 코드를 사용하여 귀하의 API에 대한 오류 / 성공 체계를 내줄 필요가 없다, 그것은 이미 당신을 다 됐어. 소비자 / API / 사용자가 게시물 및 성공적인 생성을 다시보고 싶다면 예를 들어, 단순히 201 상태 코드 (201은 = 생성) 보내주시기 바랍니다. 그것이 실패한다면 그들이 (400 = 잘못된 요청) 망치면 아마도 400가 (500 = 내부 서버 오류)를 끝에 실패한다면 500을 보내거나. 아마 그들이 게시물을 허용하지 않습니다 ... 501을 (구현되지 않음) 보내는 API를 끝점에 대해 게시하는 노력 중입니다. MySQL 서버가 다운 아마도 여러분의 API가 일시적으로 borked되도록 ... 503 (서비스를 사용할 수 없음)를 보내드립니다. 잘만하면, 그 생각을. 당신이 상태 코드에 비트를 읽고 싶다면, 위키 피 디아에 그들을 확인 : HTTP 상태 코드 목록을 .

난 당신이 API의 나머지의 개념을 활용하여 얻을 모든 이점을 볼 수 있겠죠. 정말 슈퍼 시원하고이며, 그 수치는 더 광범위하게 (적어도 제가 아는 한) PHP 커뮤니티에 대해 얘기하지 그. 이것이 가능성이 GET이나 POST, 즉 놓고 삭제되지 않는 요청을 처리하는 방법에 대한 좋은 문서의 부족으로 생각합니다. 보다시피, 그것이 다루는 비트 구피이지만, 확실히 것은 어렵지 않아. 나는 또한 밖에서 인기있는 프레임 워크의 일부는 아마 REST 구현의 일종 그러 겠죠,하지만 큰 프레임 워크 팬 (내가 들어갈하지 않을 이유가 많은 경우) 아니에요, 그것은 알고도 좋네요 누군가가 이미 당신을 위해 솔루션을 만들어 놨습 경우에도 이런 일이.

당신은 여전히​​이 유용한 API의 패러다임임을 확신하지 않는 경우, 레일에 루비를 위해 한 것이 무엇인지 휴식을 살펴보십시오. 명성에 대한 주요 주장 중 하나는 API를 (RoR 부두 교의 일종으로, 확실), 그리고 바르게 그래서를 만드는 것이 얼마나 쉽습니다. 나는 거의 RoR에 대해 알고 설령,하지만 사무실 주변 fanboys 나에게 여러 번이 지점을 전파했습니다. 하지만 난 빗나가다 ...의 일부 코드를 작성하자!

REST와 PHP 시작하기

마지막 면책 조항 : 우리가 이상 할꺼니까 코드가 강력한 솔루션의 예제로 사용되도록 의도된 어떠한 방식입니다. 여기에 나의 주요 목표는 PHP에서 나머지의 개별 구성 요소를 다루는, 그리고 여러분에게 달려 최종 해결책 '을 만드는 떠날 방법을 보여주는 것입니다.

그럼, 어디에 먹자 구! 나는 실질적인 일을 할 수있는 가장 좋은 방법은 우리가 REST API를 만드는 데 필요한 모든 유틸리티 함수를 제공 클래스를 만드는 것입니다 생각합니다. 우리는 또한 우리의 데이터를 저장하는 작은 클래스를 만들 수 있습니다. 당신은 또한 다음, 이것을 받아 그것을 연장하고, 자신의 요구에 그것을 적용할 수 있습니다. 그래서, 스텁의 몇 가지 물건을 토해내 :

 클래스 RestUtils {공공 정적 기능 processRequest () {} 공공 정적 기능 sendResponse ($ 상태 = 200, $ 몸 = '', $ 콘텐츠 _ = 'text / html과') {} 공공 정적 기능 getStatusCodeMessage ($ 상태) {/ /이 . ini 파일에 저장하고 / / parse_ini_file ()를 통해 로드할 수 ...  그러나 이것은 $ 코드 = 배열​​ (100 => '계속', 101 => '프로토콜 전환', 200 => '확인', 201 => '생성', 202 => '허용'예 / /를 충분 , 203 => '신뢰할 수없는 정보', 204 => '아니오 콘텐츠', 205 => '콘텐츠 재설정', 206은 => '일부 콘텐츠', 300 => '복수의 선택', 301 => '영구 이동' , 302 => '발견', 303 => '참조 기타', 304 => '수정되지 않음', 305 => '사용 프록시', 306 => '(하지 않는)', 307 => '임시 리디렉션', 400 => '잘못된 요청', 401 => '무단', 402 => '필수 지불', 403 => '금지', 404 => '없음', 405 => '허용되지 않는 방법', 406 => ' 허용되지 않음 ', 407은 =>'필요한 프록시 인증 ', 408은 =>'요청 시간 초과 ', 409은 =>'갈등 ', 410 =>'이 사라지고 ', 411은 =>'필수 길이 ', 412 =>'사전 조건이 실패했습니다 ' , 413 => '너무 큼 요청 법인', 414 => '요청-URI가 너무 긴', 415 => '지원되지 않는 미디어 유형', 416 => '처리할 수없는 요청 범위', 417 => '예상 실패', 500 => '내부 서버 오류', 501 => '구현되지 않음', 502 => '불량 게이트웨이', 503 => '서비스를 사용할 수 없음', 504 => 'HTTP 버전이 지원되지 않음'=> '게이트웨이 시간 초과', 505) ; 반환 (isset ($ 코드 [$ 상태]))?  $ 코드 [$ 상태] : '';}} 클래스 RestRequest {사설 $ request_vars, 개인 $ 데이터, 개인 $ http_accept, 사립 $ 방식, 공용 함수 __이 건설 () {$이 -> request_vars = 배열​​ (); $이 - > 데이터 = ''; $이 -> =를 http_accept (strpos ($ _SERVER [ 'HTTP_ACCEPT'], 'JSON'))?  'JSON': 'XML'; $이 -> 방법 = '얻을';} 공공 기능 setData ($ 데이터) {$이 -> 데이터 = $ data라는;} 공용 함수 setMethod ($ 방식) {$이 -> 방법 = $ 방식;} 공용 함수 setRequestVars ($ request_vars)는 {$이 -> request_vars = $ request_vars;} 공용 함수 getData () {$이 -> 데이터를 반환;} 공개 함수 getMethod ()는 {$이 -> 방법을 반환; } 공용 함수) (getHttpAccept {이 -> http_accept $을 반환;} 공개 함수 getRequestVars은 () {$이 -> request_vars을 반환;}} 

좋아, 그럼 우리가 가진 건 우리의 요청 (RestRequest), 우리는 요청과 응답 처리하는 데 사용할 수있는 몇 가지 정적 함수가있는 클래스에 대한 정보를 저장하기위한 간단한 클래스입니다. 보시다시피, 저희는 정말에만 쓰고 ...이 모든 걸의 아름다움입니다 두 가지 기능을 가지고! 맞아요, 넘어가요 ...

요청을 처리하는

요청을 처리하는 것은 매우 똑바른 앞으로이다,하지만 우리가 몇 어획량 (올리고 삭제 ... 대부분 넣으면 즉 함께)로 실행할 수있는 곳입니다. 우리는 순간들을 검토해 있지만, 그 RestRequest 클래스에게 비트를 검사하게됩니다. 당신이 생성자 보겠습니다면, 당신은 우리가 이미 HTTP_ACCEPT ​​헤더를 해석하고, 아무도가 제공되지 않을 경우 JSON에 defaulting하고있는 것으로 나타납니다. 거기에서 벗어으로, 우리는 들어오는 데이터를 처리하기만하면됩니다.

이제이 일을 대해서 갈 수있는 몇 가지 방법이 있지만, 그러니 우리가 항상 우리의 요청에 키 / 값 쌍을 가져 올게 있다고 가정합니다 : '데이터'=> 실제 데이터를. 자, 또한 실제 데이터가 JSON 될 것이라고 가정합니다. 나머지 내 이전 설명에 명시된 바와 같이, 당신은 JSON 또는 XML 중으로 요청과 거래의 콘텐츠 유형은 볼 수 있었지만, 지금은 간단하게합시다. 그럼, 우리의 프로세스 요청 함수는 이런 걸 조사하게 될 것입니다 :

 공공 정적 기능 processRequest은 () {/ / 얻을 우리의 동사 $ request_method = strtolower ($ _SERVER [ 'REQUEST_METHOD']); $ return_obj = 새로운 RestRequest (); / / 우리가 $ 데이터 = 배열​​ () 이곳 데이터를 저장하는 겁니다; 스위치 ($ request_method) {/ / 도착은 쉽습니다 ...  사건은 '얻을': $ 데이터 = $ _GET, 휴식, / /​​ 이렇게 게시물의 경우는 '게시물'이 있습니다 : $ 데이터 = $ _POST, 휴식, / /​​ 여기는 까다로운 비트입니다 ...  경우 'PUT': / / 기본적으로, 우리는 PHP의 특별한 입력 위치에서 문자열을 읽고, / /​​ 다음 parse_str 통해 배열로 그것을 구문 분석 ...  PHP 문서 당 : 그것이 현재 범위에있는 URL 및 세트 / / 변수를 통해 전달되는 쿼리 문자열 것처럼 / / str을 구문 분석합니다.  parse_str (file_get_contents ( 'PHP의 :/ / 입력'), $ put_vars); $ 데이터 = $ put_vars; 휴식 시간;} / / 저장 방법 $ return_obj -> setMethod ($ request_method); / / 원시 데이터를 설정하므로 필요한 경우에 액세스할 수 있습니다 (사용자의 요청에 / / 다른 부분이있을 수 있습니다) $ return_obj -> setRequestVars ($ 데이터), (isset ($ 데이터 [ '데이터'])) {/ /에 대한 개체를 JSON을 번역하는 경우 그러나 당신이 $ return_obj-> setData (json_decode를 ($ 데이터 [ '데이터'])) 원하는 사용;} $ return_obj를 반환;} 

마찬가지로 전 매우 똑바른 앞으로 말했다. 그러나 몇 가지가 일반적으로 DELETE 요청에 대한 데이터를 허용하지 않는, 먼저 ...주의하는, 그래서 우리가 스위치에 대한 사례가 없습니다. 둘째, 당신은 우리가 요청 변수 및 구문 분석 JSON 데이터 모두를 저장하는 것을 알 수 있습니다. 당신이 진정 그 자체 (새로운 사용자의 이름, 이메일, 등) 데이터가 아닌 요청의 일부 (API 키 또는 말을)로 다른 것들이있을 수 있으므로 유용합니다.

그래서 이걸 어떻게 사용해야합니까? 가 사용자 예제로 넘어가 보자. 당신은 사용자를위한 올바른 컨트롤러로 요청을 전달했습니다 가정할 때, 우리는이 같은 코드를 가질 수 있습니다 :

 $ 데이터 = RestUtils :: processRequest ();

 스위치 ($ 데이터 -> getMethod)
 {
	 사건은 '얻을'
		 / / 사용자의 목록을 검색
		 하다;
	 경우 '게시'
		 $ 사용자 = 새 사용자 ();
		 $ 사용자 -> setFirstName ($ 데이터-> getData () -> FIRST_NAME); / / 그냥 예를 들어, 이것은 청소기를 완료해야
		 / / 등등 ...
		 $ 사용자 -> 저장 ();
		 하다;
	 / / 등 등 등 ...
 }

실제 응용 프로그램에서이 작업을 수행하지 마십시오, 이건 그냥 신속 - 앤 - 더러운 예입니다. 당신은 제대로 추상 모든 것을 가진 멋진 제어 구조에서 이것을 포장을 할까 싶지만, 그러나 이것은 당신이 물건을 사용하는 방법을 이해하는 데 도움이됩니다. 하지만 난 빗나가다, 그럼 응답을 보내기로 이동하세요.

답변 보내기

우리가 요청을 해석할 수있는 자, 그럼 응답을 보내기로 이동하세요. 우리는 이미 우리가 정말해야 할 모두가 올바른 상태 코드를 보내는 것을 알고 있고, 약간의 신체 (이것은 예를 들어, GET 요청이라면)하지만, 거기는 시체가 없어 반응에 중요한 함정입니다. 누군가가 존재하지 않는 사용자 (예 : api/user/123)에 대한 샘플 사용자 API에 대한 요청을 만들어 말해봐. 보낼 수있는 적절한 상태 코드는이 경우는 404이지만, 단순히 헤더의 상태 코드를 보내는 것만으로 충분하지 않습니다. 귀하의 웹 브라우저에서 해당 페이지를 볼 경우, 당신은 하얀 화면만 것이다. 아파치 (또는 웹 서버에서 실행되는 어떤) 상태 코드를 전송되지 않으므로 어떤 상태 페이지가 없습니다 때문입니다. 우리가 함수를 만들 때 우리는 계좌로 이것을해야합니다. 마음에 모든 것을 유지, 여기서는 코드가 같은 형식이어야거야 :

	 공공 정적 기능 sendResponse ($ = 200 $ 신체 = '', $ 콘텐츠 _ = 'text / html과'상태)
	 {
		 $ status_header = 'HTTP/1.1'.  $ 상태입니다.  ''.  RestUtils :: getStatusCodeMessage ($ 상태);
		 / / 상태를 설정합니다
		 헤더 ($ status_header);
		 / / 컨텐트 유형 설정
		 헤더 ( '내용 - 형식 :'. $ 콘텐츠 _);

		 / 본문과 / 페이지 쉽습니다
		 경우 ($ 몸! = '')
		 {
			 / / 시체를 보내
			 본문 달러를 반향;
			 출구;
		 }
		 / / 우리는 누구도이 통과되지 않으면 본문을 작성해야합니다
		 다른
		 {
			 / / 어떤 신체 메시지를 만들려면
			 $ 메시지를 = '';

			 / / 이것은 순전히 선택 사항이지만, 조금 좋네요 페이지를 읽을 수있게
			 / 사용자에 대한 /.  당신은 가능성이 다른 상태 코드를 많이 보내지 때문에
			 / / 이것은 또한 유지 관리가 너무 생기 오지 말았 어야지
			 스위치 ($ 상태)
			 {
				 케이스 401 :
					 $ 메시지를 = '당신은이 페이지를 볼 수있는 권한이 있어야합니다.';
					 하다;
				 케이스 404 :
					 $ 메시지를 = '요청한 URL'.  $ _SERVER [ 'REQUEST_URI'].  '찾을 수 없습니다.';
					 하다;
				 케이스 500 :
					 $ 메시지를 = '서버가 귀하의 요청을 처리하는 도중 오류가 발생했습니다.';
					 하다;
				 케이스 501 :
					 $ 메시지를 = '요청한 메서드가 구현되지 않습니다.';
					 하다;
			 }

			 / / 서버가 항상 서명 (이것은 아파치 디렉 티브 '에서 ServerSignature "입니다)이 켜져이 없습니다
			 $ 서명 = ($ _SERVER [ 'SERVER_SIGNATURE'] == '')?  $ _SERVER [ 'SERVER_SOFTWARE'].  '에 서버'.  $ _SERVER [ 'SERVER_NAME'].  '포트'.  $ _SERVER [ 'SERVER_PORT'] : $ _SERVER [ 'SERVER_SIGNATURE'];

			 / / 이것은 실제 솔루션에 templatized되어야
			 $ 신체 = '<DOCTYPE HTML PUBLIC "- / / W3C / / DTD HTML 4.01 / / EN" "http://www.w3.org/TR/html4/strict.dtd">
						 <HTML>
							 <HEAD>
								 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
								 <TITLE> '.  $ 상태입니다.  ''.  RestUtils :: getStatusCodeMessage ($ 상태).  '</ TITLE>
							 </ 머리>
							 <BODY>
								 <h1> '.  RestUtils :: getStatusCodeMessage ($ 상태).  '</ H1>
								 <P> '.  $ 메시지가.  '</ P>
								 <hr />
								 <address>의 '.  $ 서명.  '</ 주소>
							 </ BODY>
						 </ HTML> ';

			 본문 달러를 반향;
			 출구;
		 }
	 }

그것은 그것이다! 우리는 기술적으로 우리가 요청을 처리하고 응답을 보내도록 필요한 건 다 있습니다. 의 우리가 표준 신체 반응 나 사용자가 필요 이유에 대해 좀 더 얘기합시다. GET 요청의 경우, 이것은 매우 분명하다, 우리는 XML / JSON 콘텐츠 대신 상태 페이지 (요청이 유효 제공) 보내야합니다. 다만, 처리에 게시물도 있어요. 여러분의 애플 리케이션 안에, 당신은 새로운 법인을 만들 때, 당신은 아마 mysql_insert_id과 같은 ()를 통해 새 엔터티의 ID를 가져옵니다. 귀하의 API에 사용자가 게시물면, 아마도뿐만 아니라 새로운 ID를 원할거야. 내가 일반적으로이 경우에 할거야 것은 단순히 신체 (201 상태 코드)와 같은 새로운 ID를 보내기만하면됩니다뿐만 아니라 XML이나 JSON으로 원한다면되는 포장 수 있습니다.

그럼, 우리의 예제 구현을 조금 연장의하자 :

 스위치 ($ 데이터 -> getMethod)
 {
	 / / 이것은 특히 하나가 아니라, 모든 사용자에 대한 요청입니다
	 사건은 '얻을'
		 $ user_list = getUserList (); / / 이것을 가정은 배열을 반환

		 경우 ($ 데이터 -> getHttpAccept == 'JSON')
		 {
			 RestUtils :: sendResponse (200, json_encode ($ user_list), '응용 프로그램 / JSON');
		 }
		 다른 경우 ($ 데이터 -> getHttpAccept == 'XML')
		 {
			 / / XML_SERIALIZER 배 패키지를 사용하여
			 $ 옵션 = 배열
			 (
				 '들여쓰기'=> ',
				 'addDecl'=> false를,
				 'rootName'=> $ FC-> getAction ()
				 XML_SERIALIZER_OPTION_RETURN_RESULT => 진실
			 );
			 $ serializer는 = 새로운 XML_Serializer ($ 옵션);

			 RestUtils :: sendResponse (200, $ serializer-> 직렬화 ($ user_list), '응용 프로그램 / XML');
		 }

		 하다;
	 / / 새 사용자를 만들
	 경우 '게시'
		 $ 사용자 = 새 사용자 ();
		 $ 사용자 -> setFirstName ($ 데이터-> getData () -> FIRST_NAME); / / 그냥 예를 들어, 이것은 청소기를 완료해야
		 / / 등등 ...
		 $ 사용자 -> 저장 ();

		 / / 그냥 본문과 같은 새로운 ID를 보내
		 RestUtils :: sendResponse (201, $ 사용자> getId ());
		 하다;
 }

다시 말하지만, 이건 어디 까지나 예제이지만, 그것이 편리한 물건을 구현하는 데 걸리는 방법에 약간의 노력 (나는 적어도, 생각) 과시 않습니다.

최대 배치

그래서, 그것 뿐이예요. 나는 이것이 지상에 매우 쉽게되어야한다는 점을 맞았으니 꽤 확신 해요, 그래서 당신은 더 이상 이런 것들을 가지고 아마 제대로 구현할 수있는 방법과 가까이하고 싶습니다.

실제 MVC 응용 프로그램에서, 뭐 아마도 그럴 거라 생각하면 API가 그 하중 개별 API 컨트롤러의 컨트롤러를 설정합니다. () 넣어 () 얻을 게시물을 (),과) (삭제 예를 들어, 위의 물건을 사용하여, 우리는 어쩌면 4 가지 방법을 가지고 UserRestController을 만들 것. API 컨트롤러는 요청에보고하고 해당 컨트롤러를 호출하는 방법을 결정할 것입니다. 그 방법으로하면 다음 데이터가 많다는 할 필요가 일을하고, 요청을 처리하는 데 utils을 사용 후 응답을 보내도록 utils를 사용합니다.

당신은 또한 당신의 API 컨트롤러와 조금 더 많은 데이터 모델 밖으로 그 이상 단계, 그리고 추상 걸릴 수 있습니다. 오히려 명시적으로 응용 프로그램의 모든 데이터 모델을위한 컨트롤러를 만드는 것보다, 당신은 명시적으로 정의된 컨트롤러 최초로 API 컨트롤러에 어떤 로직을 추가할 수 있으며 아무도이 발견되지 않으면, 기존의 모델을 찾아보십시오. 예를 들어, URL "api/user/1"은, 먼저 "사용자"휴식 컨트롤러 조회를 실행합니다. 아무도이 발견되지 않으면 다음 응용 프로그램에서 "사용자"라는 모델을 찾습니다 수 있습니다. 하나가 발견되면 자동으로 해당 모델에 대한 모든 요청을 처리하기위한 자동화된 부두의 비트를 쓸 수 있습니다.

더욱 우리가 간다, 당신은 다음 이전 단락의 예와 비슷한 작동하는 일반 "목록 - 모든"방법을 만들 수 있습니다. URL이 'API / 사용자 "이라고 말해. API 컨트롤러는 먼저 "사용자"나머지 컨트롤러를 확인하고, 아무도 발견되지 않은 경우 사용자가 pluaralized 것을 인식, 그것을 depluralize 후 "사용자"모델을 찾아 수 있습니다. 하나가 발견된다면,리스트에게 사용자의 목록을로드하고 그 해제를 보냅니다.

마지막으로, 당신은뿐만 아니라 아주 쉽게는 API에 다이제스트 인증을 추가할 수 있습니다. 당신만을 API에 액세스하려면 제대로 인증된 사용자를 원한다고, 음, 당신은 공정 요청 기능 (광산의 기존 응용 프로그램에서 빌린, 그래서이 인간에 정의되어 있지 않은지 참조된 몇 가지 상수와 변수가있다에이 같은 코드를 던질 수있다 ) :

			 우리가 사용자에 도전해야하는 경우 / / 알아내기
			 만약 (빈 ($ _SERVER [ 'PHP_AUTH_DIGEST']))
			 {
				 헤더 ( 'HTTP/1.1 401 무단');
				 헤더 ( "WWW-인증 : 영역 = 소화".. AUTH_REALM '을 "".. uniqid ()' "qop ="인증 ", 목하 = ', 불투명 =".. MD5 (AUTH_REALM)가' " ') ;

				 그들은 취소가 생기면 / /는 오류를 표시
				 죽고 (RestControllerLib :: 오류 (401, 진정한));
			 }

			 / / 이제 PHP_AUTH_DIGEST VAR를 analayze
			 IF (($ 데이터 = http_digest_parse ($ _SERVER [ 'PHP_AUTH_DIGEST'])) |! |! $ auth_username = $ 데이터 [ '사용자 이름'])
			 {
				 / / 나쁜 정식으로 인한 오류를 표시
				 죽고 (RestUtils :: sendResponse (401));
			 }

			 / / 지금까지, 다 좋은데, 이제 좀 더 반응을 확인 해보자 ...
			 $ A1 = MD5 ($ 데이터 [ '사용자 이름'] ':'AUTH_REALM ':'.... $ auth_pass);
			 $ A2 = MD5 ($ _SERVER [ 'REQUEST_METHOD'] ':'.. $ 데이터 [ 'URI']);
			 $ valid_response = MD5 (A1 $. ':'$ 데이터 [ '목하'].. ':'$ 데이터 [ 'NC'].. ':'$ 데이터 [ 'cnonce'].. ':'$ 데이터입니다. [ 'qop'] ':'$ A2);..

			 / / 마지막 체크 ..
			 경우 ($ 데이터 [ '응답']! = $ valid_response)
			 {
				 죽고 (RestUtils :: sendResponse (401));
			 }

멋진 물건, 어? 코드 및 일부 영리 논리 약간 사용하면 매우 신속하게 애플 리케이션에 모든 기능 REST API를 추가할 수 있습니다. 난 그냥 두 개념을 cheerlead 것을 말하는 게 아니에요, 나는 절반 정도 하루에 개인적으로 프레임 워크 중 하나에 이런 것들을 구현하고 그것에 멋진 마법의 모든 종류를 추가하는 또 다른 반일 보냈다. 당신 (독자) 내 최종 구현을 보는 데 관심이있다면 댓글로 내게 메모를 떨어뜨리면 내가 당신과 함께 그것을 공유 드리겠습니다! 당신이 공유하고 싶은 어떤 멋진 아이디어가있다면 또한,뿐만 아니라 의견의 사람을 떨어뜨릴 수 ... 내가 충분히 그것을 원한다면, 난 주제에 대한 여러분 게스트 저자가 자신의 기사 해줄 거라 확신!

다음 시간까지 ...

업데이트 : 많이 요청은 후속이 문서에 게제되었습니다 : PHP에서 편리한 요청 만들기

이 포스트를 공유하십시오 :
디그 Google 즐겨찾기 reddit Mixx StumbleUpon 테크노 야후 버즈 DesignFloat 맛있는 BlinkList 감다

어떤 응답은 "PHP로 REST API를 만들기 없습니다"하는

답장를 남겨주세요 :

이름 (필수) :
메일 (게시되지 않습니다) (필수) :
웹사이트 :
덧글 (필수) :
XHTML : 당신은 이러한 태그를 사용할 수 있습니다 <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>