티스토리 뷰

Dialogflow

Dialogflow - Webhook

sonna 2019. 1. 25. 16:19
반응형

Fulfillment에는 Webhook과 Inline Editor가 있는데, 후자가 굉장히 간단하기 때문에 이쪽을 대부분 사용하는 것 같다.

그러나 전자의 방법도 알아야 선택의 폭이 넓어지기 때문에 시도해 보기로 한다.


Webhook


1. 먼저 Dialogflow가 요청할 페이지(사이트)를 마련한다. 

URL을 적어야 하기 때문에 localhost를 사용하지 못하는 점이 매우 안타깝다.

외부에서 호출할 수 있는 페이지가 마련되면 문서( https://dialogflow.com/docs/fulfillment/how-it-works )를 보면서 소스를 만들어 보자.


2. 파라미터 받기 

Sample request to the service의 예제를 보면 Parameter가 어떤 형태로 오는지 알 수 있다. 

여기서.... 솔직하게 무식함을 고백하자면 Post body로 파라미터를 받는 방법을 알지 못했다. 이번에 알게 되어 기쁘다^_ㅜ

   

처음에는 https://powere.tistory.com/35 페이지를 참고하여 다음과 같이 body를 가져왔다.


String body = null;

StringBuilder stringBuilder = new StringBuilder();

BufferedReader bufferedReader = null;

 

try {

            InputStream inputStream = request.getInputStream();

            if (inputStream != null) {

                bufferedReader = new BufferedReader(new InputStreamReader(inputStream));

                char[] charBuffer = new char[128];

                int bytesRead = -1;

                while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {

                    stringBuilder.append(charBuffer, 0, bytesRead);

                }

            } else {

                stringBuilder.append("");

            }

} catch (IOException ex) {

        System.out.println("fail to change inputstream!");

        ex.printStackTrace();

} finally {

            if (bufferedReader != null) {

                try {

                    bufferedReader.close();

                } catch (IOException ex) {

                System.out.println("fail to close bufferedReader!");

                ex.printStackTrace();

                }

            }

}

 

body = stringBuilder.toString(); 



그러나 Spring을 사용한다면 @RequestBody를 쓸 것을 추천하다. (다른 프레임워크는 사용하지 않아서 모른다... ㅠㅠ)

저 많은 코드 없이 호출되는 메소드의 매개변수에 @RequestBody String 변수명 을 추가하면 위의 코드를 사용했을 때와 똑같은 결과를 얻을 수 있다. 혹시 파라미터를 받을 만반의 준비를 하신 분이라면 매개변수에 @RequestBody 모델 변수명 으로 바로 적용하도록 하자. String을 jsonObject로 만들고, 거기에서 다시 키를 확인하여 모델객체에 값을 넣어주는 수고를 줄일 수 있다. 


주의할 것은 이 때 모델의 데이터형이 Dialogflow에서 전달하는 파라미터와 데이터형이 맞지 않거나, 모델의 변수명에 오타가 있거나 하면 일말의 힌트도 주지 않고 호출이 되지 않는다. 

@RequsetBody String 으로 했을 때에는 데이터를 잘 전달받는데 @RequestBody 모델 로 적용했을 때에는 호출이 되지 않는다면 모델 쪽에 오류가 있는 것이니 잘 살펴보시기 바란다. ( **특히 fulfillmentMessages 와 outputContexts 파라미터는 대괄호[]로 시작하기 때문에 데이터형을 JSONObject가 아니라 Array형(JSONObject[])으로 설정해야 한다. )

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