서버 측 및 클라이언트 측 샘플 코드를 사용하여 PHP로 편안한 API를 빌드 하기 위한 시작 키트
요즘에는 확장 가능한 웹 애플리케이션을 원한다면 분산 애플리케이션이 공통 기능을 공유 할 수 있는 마이크로 또는 기타 클라우드 기반 API 서비스를 구축하는 것을 고려해야 합니다.
이 기사는 PHP로 간단하고 편안한 API를 빌드하는 방법을 보여줄 것입니다. 클라이언트에서 API 키를 수신하고 API 보안 키를 위해 MySQL 데이터베이스에 연결 한 다음 보안 키로 보호 된 JSON 웹 토큰 (JWT)을 반환하는 서버 측 API를 빌드할 것입니다.
클라이언트 측 애플리케이션은 API를 호출하여 토큰을 검색 한 다음 페이지를 작성하기 전에 쿠키에 저장하는 간단한 PHP 페이지입니다. 페이지 자체에는 쿠키를 삭제 한 다음 JavaScript를 통해 동일한 API 인터페이스를 사용하여 새 토큰을 검색 할 수 있는 간단한 jQuery가 포함되어 있습니다. 목표는 동일한 API를 호출하는 PHP 및 JavaScript 코드를 볼 수 있는 단일 페이지를 제공하는 것입니다.
또한 샘플 데이터베이스를 구축하기 위해 몇 가지 MySQL 스크립트를 포함했습니다.
완료되면 자신 만의 애플리케이션을 만들기 위해 확장 할 수 있는 견고한 기초 코드를 갖게 됩니다. 실제로 필자가 작성하는 향후 기사는 이 API 프로젝트를 통해 다른 유형의 실제 서비스를 제공하기 위해 다시 돌아와 개선하고 구축 할 것입니다.
샘플 코드
모든 샘플 코드는 다음 세 개의 GitHub 리포지토리에서 사용할 수 있습니다. 저작자 표시 없이 원하는 방식으로 이 코드를 다운로드하여 사용하십시오.
분명히 한 프로젝트의 백엔드 API와 별도의 프로젝트의 클라이언트 측 프런트 엔드를 사용하여 내 로컬 호스트에서 이 프로젝트를 빌드했습니다. 이 간단한 데모 작업을 수행하기 위해 하드 코딩 된 참조 (예 : 데이터베이스 연결 세부 정보, API 호스트 URL 등)가 있습니다. 이후 기사에서 다시 돌아와서 이러한 항목을 INI 파일 및 데이터베이스 테이블로 이동하여 프로젝트를 구체화하여 코드에 이러한 항목이 포함되지 않도록 할 것입니다. 그러나 지금은 단순하게 유지하는 것이 아이디어입니다.
이후 기사에서 다시 돌아와 이 프로젝트를 구축 할 계획이기 때문에 모든 것에 대해 별도의 리포지토리를 결정했습니다. 각 저장소의 마스터 브랜치는 항상 코드의 최신 버전이 되지만, 언제든지 롤백하고 어느 단계에서든 애플리케이션을 사용할 수 있도록 각 기능 브랜치를 저장소에 남겨 둘 것입니다. 즉, 이러한 각 리포지토리에는 원본이라는 분기가 포함되어 있으며 여기서 시작점으로 작업하는 코드가 될 것입니다.
참고로, 저의 개발 환경은 최근 기사 "macOS의 Docker 컨테이너에서 전체 개발 환경을 실행하는 방법"에서 찾을 수 있는 지침을 사용하여 전적으로 Docker 컨테이너에 설정됩니다.
데이터베이스 스크립트
MySQL 데이터베이스 스크립트를 실행하여 시작하겠습니다. 두 개뿐입니다. 하나는 api_starter 데이터베이스를 생성하고 두 번째는 API 키로 색인이 생성 될 app_api_key 테이블을 생성하고 JWT 인코딩에 사용할 관련 보안 키와 함께 API 백엔드를 제공합니다.
이 저장소를 컴퓨터에 복제하려면 터미널 창을 열고 프로젝트에 사용할 위치로 이동합니다 (개인적으로 루트 사용자 폴더에 Sites 폴더가 있습니다). 다음 명령을 사용하여 이 저장소의 원래 분기를 풀다운 합니다.
참고 : 다음 Git 명령은 줄 바꿈 된 단일 행입니다. 모든 것을 복사하여 붙여 넣으십시오.
git clone -b original https://github.com/crmcmullen/medium-php-api-starter-dbscripts.git phpapistarter_dbscripts
좋아하는 MySQL 도구를 열고 (MySQL Workbench 사용) apistarter.sql을 실행합니다. 그러면 이 프로젝트에서 사용될 데이터베이스와 데이터베이스 사용자가 빌드됩니다.
다음으로 apistarter_app_api_key.sql을 실행하십시오. 이렇게 하면 app_api_key 테이블이 빌드되고 예제에서 사용할 단일 레코드가 삽입 된 다음 테이블에 대한 뷰가 빌드 됩니다.
이것이 바로 데이터베이스입니다. 아주 간단합니다.
서버 측 API 백엔드
다음으로 API의 백엔드 코드를 아래로 당깁니다. 다시 한 번 터미널을 열고 내 사이트 폴더로 이동합니다. 내 프로젝트에서는 API 서버 코드로 phpapistarter라는 폴더를 사용하는데, 코드에서 API 호스트로 참조되는 것을 볼 수 있습니다. 다른 폴더를 사용하는 경우 코드에서 업데이트해야 합니다.
git clone -b original https://github.com/crmcmullen/medium-php-api-starter.git phpapistarter
API 서비스에는 다음 파일이 있습니다.
index.php
출처 간 요청을 허용하는 간단한 페이지. 필요한 모든 클래스를 사전 요구하고, 들어오는 API 요청의 유효성을 검사하고, 함수 요청을 API 핸들러에 전달합니다.
/src/api_handler.php
이것이 API 서비스의 핵심입니다. loadFunctionMap 함수는 모든 공용 끝점과 이들이 속한 클래스를 배열에 미리 로드 합니다. 배열을 사용하면 원하는 경우 내부적으로 함수 이름에 별칭을 지정할 수 있습니다.
예를 들어 공개 대상 끝 점이 getToken이지만 코드에서 내부적으로 function_name을 fnGetToken으로 참조한 경우 그렇게 할 수 있습니다. 이 첫 번째 버전에서 유일하게 유효한 끝점은 getToken입니다.
이 어레이에 향후 엔드 포인트를 추가해야 합니다. 끝 점이 배열에 없으면 잘못된 메서드 호출 오류가 클라이언트에 발생합니다.
validateRequest 함수는 요청을 평가하여 API 키와 토큰이 포함되어 있는지 확인하고 호출자의 app_api_key 레코드를 검색하며 API 보안 키를 사용하여 JWT를 디코딩 합니다. 그런 다음 모든 항목이 일치하고 토큰이 만료되지 않았는지 확인합니다.
getCommand 함수는 함수 맵에서 클래스 및 내부 함수 이름을 검색하고 execCommand는 이를 연관된 매개 변수가 있는 함수 호출로 변환합니다.
물론 getToken 명령은 API 핸들러의 핵심 API 엔드 포인트 명령 중 하나이며 이 데모의 초점입니다.
/src/app_autoloader.php
이 파일은 API에서 참조 할 모든 클래스를 사전 등록하고 클래스로드 속도를 높입니다.
/src/app_jwt.php
이 클래스는 여기서 Neuman Vong과 Anant Narayanan이 제공하는 JSON 웹 토큰 인코더 / 디코더 코드를 기반으로 합니다.
/src/app_response.php
표준 HTML 응답 코드 및 설명을 제공하는 간단한 클래스 라이브러리입니다.
/src/db_classes/data_access.php
이 추상 클래스는 다른 데이터베이스 클래스에 의해 확장되며 db_connect 함수를 통해 MySQL 데이터베이스에 대한 연결을 제공하고 getResultSetArray를 사용하여 ResultSet 배열을 검색하기 위한 추상 함수를 제공합니다.
db_connect에는 하드 코딩 된 연결 변수가 있습니다. 이러한 변수는 이후 프로젝트에서 대체 될 것이며 여기서 INI 파일로 이동합니다.
/src/db_classes/app_api_key.php
app_api_key 데이터베이스 테이블에 대한 데이터베이스 클래스입니다. 현재로서는 하나의 메소드가 있으며 토큰을 인코딩 / 디코딩 하기 위해 API 보안 키에 대한 호출자의 API 레코드를 검색하는 것입니다.
이것이 바로 API 서비스입니다. 물론 그 자체의 끝 점이 하나뿐입니다. 그러나 이제 프레임 워크는 향후 다른 API 엔드 포인트를 추가 할 수 있습니다.
클라이언트 측 애플리케이션
클라이언트 측 응용 프로그램의 경우 phpapistarter_client라는 폴더를 사용했습니다. 사이트 폴더로 이동하고 다음 명령을 사용하여 코드를 가져올 수 있습니다.
git clone -b original https://github.com/crmcmullen/medium-php-api-starter-client.git phpapistarter_client
나와 동일한 프로젝트 폴더 (예 : phpapistarter 및 phpapistarter_client)를 사용하는 경우 브라우저 (http : // localhost / phpapistarter_client)에서 이 프로젝트를 즉시 열고 재생할 수 있습니다.
이 클라이언트 앱은 정말 로켓 과학이 아닙니다. 두 개의 자바 스크립트 파일이 있는 단일 페이지입니다.
index.php
쿠키가 없는 경우 이 페이지는 getToken 엔드 포인트에 대한 API 호출을 수행하여 토큰을 검색합니다. 그런 다음 해당 토큰을 쿠키에 패키징 합니다.
API 키와 API 호스트가 하드 코딩 되었음을 알 수 있습니다. 이후 기사에서는 이러한 값을 INI 파일 및 데이터베이스 테이블로 이동하여 소스 코드에 포함되지 않도록 합니다. 저는 여기서 일을 단순화하려고했습니다.
그러나 프로세스 관점에서 보면 전체 트랜잭션이 페이지를 작성하기 전에 서버 측에서 발생하기 때문에 프로덕션에서 토큰을 검색하는 방법입니다.
페이지 자체의 HTML 부분은 매우 기본적입니다. 생성 된 토큰을 표시하고 이를 삭제하는 버튼과 정확히 동일한 API에 대한 JavaScript 호출로 새 토큰을 검색하는 두 번째 버튼을 제공합니다. 이것은 PHP와 JavaScript에서 동일한 API 호출을 만드는 방법을 보여주는 코드를 제공합니다.
또한 기본적인 CSS를 추가하기 위해 Bootstrap을 사용했습니다.
/js/api_handler.js
이 Javascript 파일은 일반 jQuery API 핸들러입니다. 몇 가지 변수를 전달하면 호출을 수행 한 다음 콜백을 수행합니다.
일반적으로 API 키 또는 API 호스트를 변수로 전달하지 않습니다. 대신이 JavaScript는 쿠키를 검색하고 토큰과 함께 해당 변수를 가져와 API 호출에 전달합니다. 하지만 이 데모는 쿠키가 없을 때 API를 호출 할 가능성이 있으므로 약간 다른 작업을 수행해야 합니다.
다시 한 번, 이후 기사에서 이 문제를 해결할 것입니다. PHP 코드는 항상 쿠키를 생성하며 이 JavaScript는 후속 호출을 위해 쿠키에서 필요한 것을 가져옵니다.
/js/cookie_handler.js
매우 기본적이고 일반적인 쿠키 처리 기능이 있는 JavaScript 파일.
요약
여기까지입니다. 이 간단한 데모 코드를 통해 PHP restful-API 서비스를 시작할 수 있습니다. 이 프로젝트를 기반으로 빌드 할 몇 가지 향후 기사를 작성하고 서버에서 API 처리기를 설정하여 추가 실제 유형 클래스를 호출하고 SendGrid 전자 메일 또는 같은 다른 서비스와 연결하는 방법을 보여줄 것입니다. Google reCAPTCHA 유효성 검사.
이 기사와 지원 코드가 프로젝트에 도움이 되기를 바랍니다.
https://medium.com/better-programming/how-to-build-a-simple-restful-api-in-php-c719f03cfa0a
등록된 댓글이 없습니다.