POSTMan 은 정말 괜찮은 테스트 도구 입니다.
https://www.getpostman.com/ 에서 다운 로드 받으면 되는데, Chrome 의 App 으로 나온 버전과 PC Standalone 버전이 있습니다.
Chrome 버전은 deprecate 이기 PC Standalone 버전을 쓰는 편이 좋을 것 같네요.
POSTMan 은 HEADER, GET, POST 를 자유롭게 에디팅해서 테스트로 밀어넣고 그 결과를 빠르게 확인하기 쉬운 인터페이스를 갖추고 있습니다.
API 를 제작할 때나 API 를 이용하는 앱을 개발할 때 모두 POSTMan 이 큰 도움이 됩니다.
자, 그러면 앱이나 다른 서비스에서 API 를 호출해서 회원가입을 만드는 것을 해 보기로 하죠.
워드프레스의 REST_API 를 활용하기 위해서는 rest_api_init 을 hook 해야 합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
function generate_unique_username( $username ) { static $i; if ( null === $i ) { $i = 1; } else { $i++; } if ( ! username_exists( $username ) ) { return $username; } $new_username = sprintf( '%s-%s', $username, $i ); if ( ! username_exists( $new_username ) ) { return $new_username; } else { return call_user_func( __FUNCTION__, $username ); } } function register_user($request){ global $wpdb; $creds = array(); $username = $request["username"]; $email = $request["email"]; $password = $request["password"]; $nickname = $request["nickname"]; $ret = array(); if(strlen($password) >=6){ $user_id = email_exists( $email ); if( !$user_id ){ if(!$username){ list($username) = explode('@',$email); } $username = generate_unique_username($username); $s = " wp_create_user( $username, $password, $email ); "; $user_id = wp_create_user( $username, $password, $email ); if($nickname){ wp_update_user( array( 'ID' => $user_id, 'display_name' => $nickname ) ); } $ret['id'] = $user_id; } else { $ret['code'] = 'user already exist'; $ret['data'] = array("status"=>403); $ret['message'] = "This User is already exist"; } } else { $ret['code'] = 'too short password'; $ret['data'] = array("status"=>403); $ret['message'] = "Password should be six more"; } return $ret; } |
이제 add_action 은 특정 시점에 특정 프로그램을 실행하기 위해 필요합니다.
rest_api_init 라는 타이밍에 register_api_hooks 이라는 함수를 실행하는데, 이 함수에는 REST_API 의 permalink 를 핸들링하는 부분이 있습니다.
이 부분이 중요한 라인인데요.
보통 WordPress 를 설치하면 /wp-json/wp/v2/posts 를 하면 설치된 워드프레스의 글 , 그러니깐 post 타입으로 정의된 컨텐츠들을 뿌려주거든요.
register_rest_route 은 wp/v2 처럼 별도로 정의된 REST API 의 route 을 만들어주는 작업이 되는 것이지요.
register_rest_route ‘msgapi/v1’, ‘/user/register/’, POST , register_user
API 의 namespace 를 매핑하는 파트가 첫 번째, 두 번째 파라미터이고요.
3번째는 REQUEST TYPE 을 정의하는 부분이고 마지막 4번 째는 callback 함수를 선언해주는 부분입니다.
이제 register_user 함수 부분을 볼까요 ?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
function register_user($request){ global $wpdb; $creds = array(); $username = $request["username"]; $email = $request["email"]; $password = $request["password"]; $nickname = $request["nickname"]; $ret = array(); if(strlen($password) >=6){ $user_id = email_exists( $email ); if( !$user_id ){ if(!$username){ list($username) = explode('@',$email); } $username = generate_unique_username($username); $s = " wp_create_user( $username, $password, $email ); "; file_put_contents("/home/msgapi/public_html/log/t.log",$s); $user_id = wp_create_user( $username, $password, $email ); if($nickname){ wp_update_user( array( 'ID' => $user_id, 'display_name' => $nickname ) ); } $ret['id'] = $user_id; } else { $ret['code'] = 'user already exist'; $ret['data'] = array("status"=>403); $ret['message'] = "This User is already exist"; } } else { $ret['code'] = 'too short password'; $ret['data'] = array("status"=>403); $ret['message'] = "Password should be six more"; } return $ret; } |
WP_REST_API 에서는 에러 메세지 코드에 사용되는 파라미터가 code, data, message 이기 때문에, 가급적 비슷하게 만들어 보았고요.
이 부분의 코드는 username email password nickname 을 받아서 wp_users 와 wp_usermeta 에 넣는 작업입니다.
wordpress 는 미리 정의해둔 함수를 사용하여야 합니다.
왜냐하면 다른 플러그인들도 다 유기적으로 엮혀 있기 때문에 이 부분을 $wpdb->query(” insert wp_users .. “) 이런 식으로 회원등록을 할 수도 있겠지만, 그렇게 되면, 다른 플러그인들과 유기적으로 연결된 코드들이 작동하지 않게 될 것입니다.
왜냐하면, 회원 가입과 관련된 플러그인은 wp_create_user 함수 내에 do_action 부분을 add_action 으로 연결하고 있기 때문이지요.
워드프레스 개발의 핵심은 이런 구조적 연결성과 의존성을 이해하는 것입니다.
자, 그러면 POSTMan 으로 회원가입을 만들어 볼까요 ?
API 로 회원가입을 하는건 네임스페이스에 파라미터를 규칙에 맞추어 전송하는 작업을 하면 되는데, 이 과정은 PostMan 으로 하면 좀 더 간편합니다.
1 2 3 4 5 6 7 8 9 |
http://msgapi.wper.kr/wp-json/msgapi/v1/user/register/ POST /wp-json/msgapi/v1/user/register/ HTTP/1.1 Host: msgapi.wper.kr Content-Type: application/x-www-form-urlencoded Cache-Control: no-cache Postman-Token: feb98489-7432-58e1-1fa1-3c42a7dbb154 username=userid1&password=password!%40&email=userid01%40wper.kr&nicename=%ED%85%8C%EC%8A%A4%ED%8A%B8%EC%9C%A0%EC%A0%80 |
Postman 의 Code 부분을 보면 RAW 파일로 호출 URL 값을 확인할 수 있습니다.
이것을 Angular.js 로 구현하려면
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
( function() { var app = angular.module( 'msgAPI', [] ); app.controller( 'MainController', function( $scope, $http ) { var apiHost = 'http://msgapi.wper.kr/wp-json'; $http.post( apiHost + '/msgapi/v1/token', { username: 'user01', password: 'password!@', email: 'user01@wper.kr', nickname: '테스트유저' } ) .then( function( response ) { console.log( response.data ) } ) .catch( function( error ) { console.error( 'Error', error.data[0] ); } ); } ); } )(); |
다음 편에는 회원 로그인과 JWT 인증, Authorization Bearer 에 관한 이야기를 할까 합니다. 기대해주세요.