티스토리 뷰



매우 늦었지만.. 방학 2주차 포스팅을 시작합니다~

오늘은 REST API를 배우기 위해 REST에 대해서 한번 더 짚고,

REST API인 다음 카카오의 검색 API와 네이버의 성인 검색어 판별 API를 사용하는 법을 배워보도록 하겠습니다.




01. RESTful?


REST가 과연 뭐길래? 

REST는 웹의 장점을 최대한으로 활용할 수 있는 네트워크 기반의 아키텍쳐이다.


쉬운 이해를 위해 예를 들자면,


http://news.kbs.co.kr/news/view.do?ncd=3421128

는 Non RESTful URI로 이 URI를 보고서는 어떤 자원(resource)인지 쉽게 파악할 수 없다.


하지만

http://class.likelion.net/boards/1/posts/406

는 RESTful URI로 URI를 통해 자원(resource)가 게시판들첫번째 게시판글들406번째 글임을 쉽게 알 수 있다.



이렇듯 REST는 

URI를 이용해 명시된 자원(resource)에 접근하고,

자원(resource)에 어떠한 조작(CRUD)을 할 지 HTTP 메서드로 나타내는 방법이다.



HTTP Method는 각각 CRUD에 대응되는데 이는 자원에 어떤 조작을 할 지 나타내는 역할을 하게 된다.




그럼 RESTful한 URI를 함께 살펴보자

URI(URL)에 리소스(user의 강나영)가 나타나있고,

같은 리소스에 대해 Http Method를 다르게 명시해줌으로써 리소스에 CRUD 중 어떤 조작을 수행할지 알려준다.



이렇게 RESTful하게 개발을 하면 쉽고, 기존 웹(HTTP)을 그대로 따라가면서도 의미적으로 구조가 잘 잡힌 URI를 만들 수 있으므로 앞으로는 RESTful하게 개발을 해보자!



RESTful에 대해 더 상세하게 알고자 한다면 다음 사이트를 참고하자.

https://www.slideshare.net/Byungwook/rest-api-60505484






02. 다음 카카오 검색 API


1) 다음 카카오 검색 API 살펴보기


우선 검색 API를 구현하기 위해 검색기능이 구현된 게시판 코드를 복사한다.

git clone https://github.com/binue/summer_restapi.git


우리는 최종적으로

검색을 했을 때 해당 게시판에 검색하고자 하는 내용이 있으면 보여주고, 검색하고자 하는 내용이 없으면 다음 카카오 검색 API를 이용해 카카오(다음) 검색 결과를 가져오고자 한다.





카카오 계정 사전 작업은 편의상 블로그에서는 생략한다.


카카오 개발자 페이지의 REST api, 웹문서 검색에 대한 가이드를 함께 살펴보자!

https://developers.kakao.com/docs/restapi/search#웹문서-검색




Request - 요청


서버에 대한 요청은 위와 같은 형식으로 이루어진다.

GET방식으로 URI ~ /v2/search/web (리소스)에 대해 요청을 하는데 이 때, app_key를 함께 넘겨주준다. 넘겨준 app_key가 사전에 등록된 앱 키여야 해당 api를 이용할 수 있다.




더 상세한 예를 보면, 요청 코드는 GET방식으로 https://dapi.kakao.com/v2/serach/web URI에 접근해야 하고 이때 검색할 검색어를 "query=검색어" 형식으로 URI에 덧붙여서 요청해야 한다.

이 때 한글에 대한 인코딩(encoding)도 필요한 것을 알 수 있다.

또한 앱 키는 위에서 명시한 형식으로 헤더에 포함되어 전달되어야 한다. 




Response

요청에 대한 서버의 응답은 JSON 객체로 반환된다.

JSON은 meta와 document로 구성되며 각각의 구성은 위와 같다.








2) 다음 카카오 검색 API 구현하기


보통 파싱(=가져오기)은 Nokogiri 젬을 많이 이용한다.

따라서 노코기리 젬은 문서도 많고 참고할 사이트도 많다.

이번에는 루비의 많은 젬 중 rest-client라는 젬을 사용해보도록 하자!



이유1) 심플한 사용법

이유2) 예제 없이 젬 가이드 + 구글링으로 원하는 결과를 만들어보자  (*해커톤 개발의 필수 능력*)

경고 : 쉬워보여서 선택했다가 빡침 유발하는 st






 수정 - result.html.erb

1
2
3
4
5
<if @resultPost.empty? %>
    <h3><class="text-warning"><%= @keyword %></b>에 대한 검색 결과가 없습니다.</a></h3>
    <!-- 검색 결과 없으면 카카오(다음) 검색 API 사용, 카카오 검색 결과 보여주기 -->
    <%= link_to @keyword + '에 대한 다음(kakao) 검색 결과 확인하기'"/result2/"+@keyword  %>
<else %>
cs


게시판에 대한 검색 결과가 없다면 카카오 검색 결과로 연결할 수 있도록 뷰 파일에 위 코드를 추가해준다.



라우트 수정 - routes.rb

1
get 'result2/:keyword' => 'post#result2'   #카카오 웹문서  검색 결과 페이지
cs

라우트 연결은 필수! 

link_to로 변수도 함께 넘겨주었으므로 라우트에서 이를 keyword로 받고, post의 result2액션에 전달한다.



컨트롤러 수정 - post_controller.rb

1
2
3
4
5
6
7
8
9
10
11
12
def result2
  @keyword = params[:keyword]
  url = "https://dapi.kakao.com/v2/search/web?query=" + @keyword
  uri = URI.encode(url)
  res = RestClient.get(uri, headers={'Authorization':'KakaoAK *카카오 앱 키*'})
  
  unitokor = eval(res)   
  json_g =  JSON.generate(unitokor)
  hash = JSON.parse(json_g)
      
  @item = hash['documents']
end
cs


컨트롤러에서 검색 API에 요청해보자!

다시 한 번 밝히지만 이 방법은 가장 효과적으로 REST API를 이용하는 방법은 아니다.

시행 착오를 겪으면서 원하는 결과를 낼 수 있도록 차근차근 따라가보자.



1) uri 인코딩

한글을 uri에 포함시키기 위해서는 키를 포함한 uri를 인코딩 해야한다. 

(uri를 인코딩 해야하는 이유 : http://regularmotion.kr/url-encoding-url/ )

이를 위해 URI.encode메소드를 이용해 url를 uri로 인코딩한다.


2) api 요청

RestClient젬을 이용, RestClient.get메소드의 인자에 uri와 header에 해당하는 카카오 앱 키를 포함시키고 메소드의 결과를 res로 받는다.


3) 반환 객체 unicode code -> 한글 변환 


반환된 res를 출력해보면, 위와 같이 이상한 문자들이 찍혀나온다.

이는 유니코드가 변환되지 않고 그대로 출력되어서 생긴 문제인데 이를 해결하기 위해 구글링을 열심히 해보다 아래의 티스토리(http://knight76.tistory.com/entry/ruby-unicode-code-%EB%AC%B8%EC%9E%90%EC%97%B4%EC%9D%84-eval%EB%A1%9C-%ED%95%9C%EA%B8%80%EB%A1%9C-%EB%B3%80%ED%99%98%ED%95%98%EA%B8%B0)에서 eval함수를 찾게 되었다.



따라서 수업 코드에는 eval함수를 사용, unitokor로 변환해주었는데 블로그를 작성하다 다음과 같은 게시물을 발견하게 되었다.


Ruby에서 eval의 정확한 역할이 뭔가요? 그리고 쓰면 안좋다는데 정말 그런가요?

(http://hashcode.co.kr/questions/2756/ruby%EC%97%90%EC%84%9C-eval%EC%9D%98-%EC%A0%95%ED%99%95%ED%95%9C-%EC%97%AD%ED%95%A0%EC%9D%B4-%EB%AD%94%EA%B0%80%EC%9A%94-%EA%B7%B8%EB%A6%AC%EA%B3%A0-%EC%93%B0%EB%A9%B4-%EC%95%88%EC%A2%8B%EB%8B%A4%EB%8A%94%EB%8D%B0-%EC%A0%95%EB%A7%90-%EA%B7%B8%EB%9F%B0%EA%B0%80%EC%9A%94)


그래서 해결방법을 찾다가 JSON.parse메소드를 발견 했고, 따라서 eval 메소드를 JSON.parse 메소드로 조금 수정해보자!

(https://stackoverflow.com/questions/7885096/how-do-i-decode-a-string-with-escaped-unicode)


1
2
3
4
5
6
7
8
9
10
11
12
def result2
  @keyword = params[:keyword]
  url = "https://dapi.kakao.com/v2/search/web?query=" + @keyword
  uri = URI.encode(url)
  res = RestClient.get(uri, headers={'Authorization':'KakaoAK *카카오 앱 키*'})
  
  unitokor = JSON.parse(res)
  json_g =  JSON.generate(unitokor)
  hash = JSON.parse(json_g)
      
  @item = hash['documents']
end

cs


4) 반환 객체(string) -> JSON 변환 및 파싱 

반환된 unitokor코드를 뷰 파일에 던져주기 위해서 unitokor["documents"]를 사용했으나, 

이와 같이 RestClinet의 반환 객체가 String임으로 ["~"]로 접근이 불가능하다!

따라서 String을 JSON객체로 변환 해주자.

우선 JSON 객체를 생성해주고,


생성된 JSON 객체를 파싱해 hash 객체에 넣는다,

그 다음 뷰파일에 던져줄 @item 변수에 hash['documents']를 넣어준다.



 수정 - result2.html.erb

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<h4><class="text-warning"><%= @keyword %></b>에 대한 카카오(다음)검색결과입니다.</a></h4>
<table class="table table-hover table-striped">
  <thead>
    <th width="400px">글 제목</th>
    <th>글 내용</th>
  </thead>
  <tbody>
    <% @item.each do |iteminfo| %>
      <tr>
        <td>
          <%= link_to iteminfo['title'].html_safe,  iteminfo['url'] %>
        </td>
        <td>
          <%= iteminfo['contents'].html_safe %>
        </td>
      </tr>
    <end %>
  </tbody>
</table>
cs


그 다음 JSON반환 결과를 result2 뷰파일에 뿌려주자!

여기서 html_safe메소드는 검색 API에서 반환된 JSON객체 내부에 키워드에 굵게(<b></b>)태그가 걸려있기 때문에, 이를 반영하기 위해 사용하였다.






02. 네이버 성인검색어 판별 API


1) 네이버 성인검색어 판별 API 살펴보기


네이버도 검색 API가 있지만, 다른 기능을 구현하는 예제가 더 좋을 것 같아서 앞서 구현한 카카오 검색 API와 함께 활용할 수 있는 성인 검색어 판별 API를 사용해보았다.

또 앞서 카카오(다음)은 JSON객체만을 반환하지만 네이버는 JSON, XML을 둘 다 지원하므로 이번에는 XML로 반환받고 파싱하도록 하자.


네이버도 개발자 계정 사전 작업은 생략한다.





이번 예제에서 사용할 젬은 HTTParty젬!

젬을 선택한 이유는 다음과 같이 세 가지다.


이유1) 노코기리보다 간단하다!

이유2) 예제 없이 젬 가이드 + 구글링으로 원하는 결과를 만들어보자

          (*해커톤 개발의 필수 능력*)

이유3) 저 움짤이 예뻐서^0^....



이 젬이 앞서 사용했던 젬 보다 사용법이 간단하고 더 많은 예제들을 찾을 수 있기 때문에 이 젬을 더 추천한다.



본격적으로 네이버 성인 검색어 판별 API 문서를 살펴보자!

https://developers.naver.com/docs/search/adult/


이 API는 GET방식으로 url에 접근한다.



그리고 판별할 키워드를 query=키워드꼴로 url에 포함해주면 된다.

또한 네이버 client id와 client secret도 헤더에 포함시킨다.


해당 url로 서버에 요청을 하면, 키워드가 일반 검색어라면 0을, 성인 검색어라면 1을 리턴한다.





2) 네이버 성인검색어 판별 API 구현하기


컨트롤러 수정 - post_controller.rb


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
  def result2
    @keyword = params[:keyword]
    
    adult_url = "https://openapi.naver.com/v1/search/adult.xml?query="+@keyword
    adult_uri = URI.encode(adult_url)
    
    response = HTTParty.get(adult_uri, headers: {'X-Naver-Client-Id' => '*네이버 Client ID*''X-Naver-Client-Secret' =>'*네이버 Client Secret*' })
   
    if response["result"]["item"]["adult"== '1'
      redirect_to '/', :flash => { :alert => "성인 검색어는 검색이 불가능합니다." }
    else
      url = "https://dapi.kakao.com/v2/search/web?query="+@keyword
      uri=URI.encode(url)
      
      res = RestClient.get(uri, headers={'Authorization':'KakaoAK *카카오 앱 키*'})
      unitokor = JSON.parse(res)
      puts unitokor
      
      json_g =  JSON.generate(unitokor)
      hash = JSON.parse(json_g)
      
      @item = hash['documents']
    end
  end
cs


1) uri 인코딩

한글을 uri에 포함시키기 위해서는 키를 포함한 uri를 인코딩 해야한다. 

(uri를 인코딩 해야하는 이유 : http://regularmotion.kr/url-encoding-url/ )

이를 위해 URI.encode메소드를 이용해 url를 uri로 인코딩한다.


2) 반환 객체로 성인 검색어 판별하기

반환 객체에 접근하기 위해 xml구조를 따라 차례대로 ["result"]아래 ["item"]아래 ["adult"]에 접근한 후 이를 문자열 1과 비교한다.


이 때 값이 1이면 성인 검색어이므로 alert를 띄우고, 값이 1이 아니라면 0일 것이고 이는 일반 검색어라는 말이므로 앞서 구현한 다음 카카오 검색 결과를 띄운다.







03. REST API


앞서 설명한 다음 카카오 API와 네이버 API만 잘 익혔다면, 이제 다른 REST API도 자신있게 사용할 수 있다! 

특히 공공데이터는 승인 절차때문에 수업에서 다루지는 못했지만 다양한 데이터가 많으므로 꼭 한 번 이용해보도록 하자.







긴 글 읽느라 수고많으셨습니다!

다들 해커톤 화이팅팅팅



댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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
글 보관함