파이썬에서 api를 찔러보고 결과를 가져오게 하기 위해서 requests 모듈을 많이 쓰곤 합니다. 제 토이프로젝트 또한 json으로 리퀘를 받으면 처리를 적절히 해서 json으로 떨구게 됩니다. 제가 구축해 놓은 도서관 서버의 api를 보면서 어떻게 requests 모듈을 써야 할 지 간단하게 알아보도록 하겠습니다.

 

 제약 조건이 하나 있다면, https는 적용했지만, self signed 인증서입니다. 그리고 모든 api는 json으로 응답하게 됩니다.

 

 


 먼저, base_url 입니다. 보통 저 url은 겹치니 따로 base_url로 빼는 게 더 가독성이 좋은 듯 싶더라고요.

 

 

 먼저 1번째 api인 /reg 입니다. POST 요청이고요. userEmail과 userName과 userPw를 보내면 중복된 id가 있는지 체크한 다음에 없다면 가입이 되게 됩니다. 이 부분 어떻게 보내면 될까요? 일단 post 방식으로 보낸다 했으니 requests.post를 쓰면 됩니다.

 

 

 8번째 줄을 보시면 json이 있는데요. json 형식으로 보낸다는 의미입니다. userEmail과, userName과 userPw 속성을 묶어서 보냈음을 알 수 있어요. 이것만 작성하면 가입하는 api를 호출하는 함수는 모두 작성한 셈이 됩니다. 밑에 verify가 있는데요. 이 부분은 제가 인증서를 self sign 했기 때문에 넣었습니다.

 


 다음에 /login api 역시 POST입니다. 딱히 어려운 건 없어 보이고요. userName과 userPw를 json 형식으로 넘겨주어서 로그인이 성공한다면 200 응답과 함께 json 형식으로 아래 데이터를 리턴해 줍니다.

 

 

 accessToken과 refreshToken을 돌려주네요. 여기서 필요할 법한 것은 accessToken이니, 로그인 처리가 성공적으로 된다면, 이 토큰 값을 얻어오면 됩니다. 이 부분은 아래와 같이 처리하시면 됩니다.

 

 

 request.post 부분은 크게 바뀐 것이 없어 보여요. 중요한 것은 'accessToken'을 얻어오는 것인데요. 일단 우리의 목적은 json으로 되어 있는 것을 dict이나 다른 object로 떨어트리는 것이거든요. 이것을 response의 json 메서드가 해 줍니다. 이 메서드의 내부를 보면 유추해 보실 수 있는데요.

 

 

 complexjson.loads를 보겠습니다. 그러면 이것의 text를 넘겨가지고 뭔가 하겠다는 의미인데요.

 

 

 이 메서드의 설명을 보시면, Deserialize 한다고 되어 있어요. 어? 이게 뭔 소리지? 하고 봤는데요. JSON documents를 python 객체로 바꿔주는 역할을 합니다.

 

 

 custom한 JSONDecoder subclass를 쓰게 하기 위해서, cls kwarg에 명시하라 되어 있어요. 그렇지 않으면 JSONDecoder가 사용된다고 되어 있어요. 이제 문서를 봅시다. 문서에서 Encoders and Decoders가 있고요. 그 밑에 표가 하나 있을 텐데요. object는 디폴트로 dict로, array는 list로 transform 된다고 되어 있어요.

 

 

 json에서 이것은 object인가요? 배열인가요? {은 오브젝트, [은 배열을 의미합니다. {으로 시작했나요? 그러면 object입니다. 따라서, 이것이 deserialize 되면 python의 dict가 될 것이니 response.json()['access_token'] 요래 얻어오면, access_token 값을 얻어 오겠네요.

 


 마지막 예제는 GET /book입니다. 억세스 토큰으로 인증하면, 이 api를 호출할 수 있습니다. 책 분류 번호와 이름, 빌려간 책인지 여부 등을 query string으로 받아서 처리합니다.

 

 

 swagger로 떨궈 보면, 요런 식으로 되어 있고요. 여기서, borrowFlag만 true로 준 다음에 호출해 보겠습니다.

 

 curl로 호출한다면 요런 식으로 호출이 될 겁니다. 딱히 어려울 건 없습니다. -H가 중요한데요. 헤더를 의미합니다. 헤더를 보시면, jwt_access_token이 있는데요. 로그인에 성공했을 때 발급받은 jwt token 값을 넣어주면 됩니다. 책 이름을 입력 받으면, 빌릴 수 있는 책들을 모두 출력하는 api를 작성해 봅시다.

 

 

 변한 건 없고요. params가 있어요. 이것은 query string에 들어가는 요소들을 의미하는데요. borrowFlag가 false이면서 특정 책 이름을 가진 책을 가져와야 하니 저래 넣었습니다. 다음에 200 OK가 응답 코드로 오면 response.json()을 리턴하게 되는데요. 응답값 예제를 봅시다.

 

 

 앞에 [로 시작합니다. 그러면 array라는 의미입니다. array긴 array인데, object가 여러 개 있으니까 object가 여러 개 있는 배열을 의미합니다. get_available_book 메서드가 리턴하는 것은 list가 됩니다.

 

 

 그러면 for 문으로 순회를 할 수 있을 겁니다. 49번째 줄이 이를 수행하는 for loop입니다. 그리고 book 각각은 object이니, dict로 떨어질 겁니다. 책 이름을 얻어오기 위해서는 'bookName'을 키로 가지는 value값만 찾으면 됩니다. 50번째 줄이 이를 수행합니다.

 

 

 실행 결과는 위와 같습니다.