← 돌아가기

7. RESTful API 사용법


RESTful API를 사용할 수 있습니다.

  1. 사전준비 및 테스트
  2. API사용하기
  3. curl 테스트하기

먼저 스토리를 만들고 메뉴의 채널을 클릭하여 채널정보에서

api_url을 취득하여 사용할 수 있습니다

1 . api_url 생성 및 테스트


스토리를 만들면 자동으로 api_url이 생성되고 테스트 해 볼 수 있습니다.
api_url을 확인하는 방법은 스토리 오른쪽 상단의 아이콘 클릭> 채널선택 클릭으로 확인할 수 있습니다.

그리고 
다음은 공개/공유챗봇인 [◈사용예제◈ 복수개의 엔티티]의 예이다.
 
1) api_url생성
 
채널화면에서 Publish로 변경 선택한다.
api_url : http://mindmap.ai:8000/v1/58cafe0265d44057613c765f/
상기 url을 브라우저에서 열어본다.(열어보기)
 
2) api_url의 api 테스트화면 테스트하기
 
다음의 json형식으로 테스트를 하면된다.
(아래의 json 코드는 대화창의 닫기버튼아래의 <> 코드아이콘을 클릭하면
 코드들이 나오고 코드중에서 User Input 부분의 json 코드이다.)
 
테스트방법
화면에서 다음코드를 content에 입력하고 POST버튼을 클릭하면 된다.
{
  "story_id": "58cafe0265d44057613c765f",
  "context": {
    "variables": null,
    "information": {
      "conversation_counter": 1,
      "conversation_stack": [
        {
          "conversation_node_name": ".start",
          "conversation_node": "75c34db7-3899-4abb-b14f-889b50a7aa83"
        }
      ],
      "user_request_counter": 1
    },
    "visit_counter": 0,
    "reprompt": false,
    "retrieve_field": false,
    "input_field": null,
    "conversation_id": "ac1c0174-33b8-42bc-897d-9f659d774360"
  },
  "input": {
    "text": "짜장면 짬뽕 배달해 줘요"
  }
}
 
다음과 같은 결과를 얻을 수 있다
 
POST /v1/58cafe0265d44057613c765f/
HTTP 200 OK
Access-Control-Allow-Origin: *
Allow: POST, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "context": {
        "variables": null,
        "information": {
            "conversation_counter": 2,
            "conversation_stack": [
                {
                    "conversation_node_name": "@메뉴:짜장면 and @메뉴:짬뽕",
                    "conversation_node": "f5873ca8-9bf5-7ab4-b6a9-9dc83395a0c4"
                }
            ],
            "user_request_counter": 2
        },
        "visit_counter": 0,
        "reprompt": false,
        "retrieve_field": false,
        "input_field": null,
        "conversation_id": "ac1c0174-33b8-42bc-897d-9f659d774360"
    },
    "channel": {
        "user_id": null,
        "channel_id": "mrmind_client"
    },
    "story_id": "58cafe0265d44057613c765f",
    "time": "2017-04-01T15:00:31.962",
    "_id": "58df41ff65d440196d22be2a",
    "timeutc": "2017-04-01T06:00:31.962",
    "output": {
        "visit_nodes": [
            "376b144a-6d1f-790b-8148-edf26a914892",
            "f5873ca8-9bf5-7ab4-b6a9-9dc83395a0c4"
        ],
        "text": [
            "짜장면 과 짬뽕 을 배달해 드리겠습니다."
        ],
        "visit_nodes_name": [
            "#배달 &nbsp;or @메뉴",
            "@메뉴:짜장면 and @메뉴:짬뽕"
        ],
        "visit_nodes_text": [
            "",
            "@메뉴:짜장면 과 @메뉴:짬뽕 을 배달해 드리겠습니다."
        ]
    },
    "input": {
        "text": "짜장면 짬뽕 배달해 줘요"
    },
    "intents": [
        {
            "intent": "배달",
            "example": "배달 해줘",
            "confidence": "0.443585881696588"
        }
    ],
    "entities": [
        {
            "entity": "메뉴",
            "value": "짜장면",
            "keyword": "짜장면"
        },
        {
            "entity": "메뉴",
            "value": "짬뽕",
            "keyword": "짬뽕"
        }
    ]
}

 

2 . API사용하기


 api을 어떤형식으로 주고 받는지를 알아보았습니다.
 
1) 실제 사용하는 방법은 api_url를 이용하여 python, node, php, java, javascript 등의 개발 언어를 이용하여 api_url에 접속하여 json형식을 정보를 던지면 받은 payload(변수뭉치들)와 대화관리에서 정한  #intent,  @entity, context, output 정보등을 이용하여 자신만의 응용프로그램을 만들 수 있습니다. 
 
 

3 .curl 테스트하기


아래는 실제 curl을 이용한 예제입니다.
 
curl -XPOST -H 'Content-Type: application/json' http://mindmap.ai:8000/v1/58cafe0265d44057613c765f/ -d '{"story_id": "5900581865d4400bc56c3f50","context": {"visit_counter": 0,"conversation_id": "e05250dd-bb2f-44d0-be73-329a961a9607","reprompt": false,"input_field": null,"retrieve_field": false,"variables": null,"information": {"user_request_counter": 1,"conversation_stack": [{"conversation_node_name": ".start", "conversation_node": "bf3b11c0-f01b-4fb0-8bc6-cea76dc7ca02" } ],"conversation_counter": 1}}, "input": {"text": "abc"}}'
 
 
회신값:
{"intents":[],"context":{"visit_counter":0,"conversation_id":"e05250dd-bb2f-44d0-be73-329a961a9607","reprompt":false,"input_field":null,"retrieve_field":false,"variables":null,"information":{"user_request_counter":2,"conversation_stack":[{"conversation_node_name":".mr","conversation_node":".mr"}],"conversation_counter":2}},"output":{"visit_nodes_name":[".mr"],"visit_nodes_text":[null],"text":"ㅕㅕ","visit_nodes":["e5744cff-163c-79e8-b5ec-8a494a9c9344"]},"channel":{"user_id":null,"channel_id":"mrmind_client"},"input":{"text":"abc"},"entities":[],"story_id":"5900581865d4400bc56c3f50","time":"2017-04-27T06:53:13.935","_id":"590116c965d4400bc56c40d2","timeutc":"2017-04-26T21:53:13.935"}
 
 

4 .nodejs 테스트하기


아래는 실제 nodejs을 이용한 예제입니다.
/**
 * [중요]주석을 꼭 읽어주세요. context를 주고 받는게 제일 중요합니다. 받은 context을 그대로 넘겨주면 됩니다.
 * 초기에 context를 inputJsonObjectDataInit로 만들어서 request 보내고
 * 그 다음 부터는 받은 context를 그대로 넘겨주면 됩니다.
 */
 
 
console.log("--------- Mindmap.ai의 Restful api와 통신하는 Nodejs 예제입니다. ----------");
 
// var http = require('http');  // 이것을 사용하면, 한글 적용시 에러가 나서 안쓰시길 권장합니다. 에러발생
var request = require('request');    // $ npm install request
var uuid = require('uuid-v4');  // $ npm install uuid-v4
 
// api url 및 story_id 설정
var story_id = "58cafe0265d44057613c765f"; // <-- [중요] 적용할 스토리아이디 입력 : 스토리리스트>채널 클릭>>채널정보 화면에서 확인 가능
var url = 'http://mindmap.ai:8000/v1/' + story_id + '/';
 
// [중요] 맨처음 보낼 initial default payload 작성한다.
// 그 후는 아래에서 ('// **다시 보낼 payload 재가공하기':line 72 참조) 재가공된 new_inputJsonObjectData 를 이용하세요.
// 그래야지 mindmap 스토리가 잘 작동합니다.
// 초기에 아래의 default 값을 이렇게 보내면 마인드맵의 .start가 실행되어 그 대화표시 payload 가 반환된다.
var inputtxtinit = "";
var inputJsonObjectDataInit = {
    "story_id": story_id,
    "context": {
        "conversation_id": uuid(), // 각각의 유저와의 대화로 따로 구별하기 위해서 uuid-v4를 이용하여 만든다. 로그관리에 필요하다.
        "information": {
            "conversation_stack": [
                {
                    "conversation_node": 'root',
                    "conversation_node_name": '루트노드'
                }
            ],
            "conversation_counter": 0,
            "user_request_counter": 0,
        },
        "visit_counter": 0,
        "reprompt": false,
        "retrieve_field": false,
        "message": null,
        "keyboard": null,
        "random": false,
        "input_field": false,
        "variables": null
    },
    "input": {
        "text": inputtxtinit
    }
};
 
// request 보내기
var json = '';
request({
        url: url,
        method: 'POST',
        json: inputJsonObjectDataInit
 
    },
 
    // response 받기
    function(error, response, body){
        console.log("--------- response된 payload json 시작 ----------");
        console.log(body);
        console.log("--------- response된 payload json 끝 ----------");
        console.log("");
        json = body;
 
        // 받은 텍스트보기
        var outputTextArray = json["output"]["visit_nodes_text"];
        console.log("outputTextArray: " + outputTextArray.toString());
        for(var i=0 ; i < outputTextArray.length ; i++){
            //실행된 모든 노드의 대답을 표시한다
            console.log(outputTextArray[i]);
        }
 
 
        // ** 다시 보낼 payload 재가공하기
        console.log("");
        console.log("--------- payload 를 받고서 보낼 new_inputJsonObjectData 재가공하기 시작 ----------");
        var new_inputtxt = '가공후 다시 보낼 메시지';  // 이부분만 재가공하여 처리하여 다시 메시지를 보내면 된다.
        var new_context = json['context'];
        var new_inputJsonObjectData = {
            "story_id": story_id,
            "context": new_context,
            "input": {
                "text": new_inputtxt
            }
 
        }
        console.log("받은 context 지만 다시 보낼 context: " + JSON.stringify(new_context));  // 그대로 보내야지 변수들이 유지되어 mindmap이 잘 작동한다.
        console.log("가공후 새롭게 보낼 new_inputtxt: " + new_inputtxt);
        console.log("재가공된  'new_inputJsonObjectData' 이걸 다시 request를 만들어 보내면 된다. : " + JSON.stringify(new_inputJsonObjectData));
        console.log("------------ 보낼 new_inputJsonObjectData 재가공하기 끝 ----------");
    });
 
 
// simple request & response sample
// // request 보내기
// var json = '';
// request({
//     url: url,
//     method: 'POST',
//     json: inputJsonObjectData
//
// },
//     // response 받기
//     function(error, response, body){
//     console.log(body);
//     json = body;
//     var outputTextArray = json["output"]["visit_nodes_text"];
//     console.log("outputTextArray: " + outputTextArray.toString());
//     for(var i=0 ; i < outputTextArray.length ; i++){
//         //실행된 모든 노드의 대답을 표시한다
//         console.log(outputTextArray[i]);
//     }
//
// });