티스토리 뷰
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[])으로 설정해야 한다. )
'Dialogflow' 카테고리의 다른 글
[Dialogflow] com.google.api.gax.rpc.UnavailableException: io.grpc.StatusRuntimeException: UNAVAILABLE: io exception (0) | 2019.08.26 |
---|---|
Dialogflow 의 구성 (0) | 2019.01.22 |