使用ABAP调用图灵api制作个简单的聊天机器人
闲来无事的时候想着做点什么,正好看到了图灵的聊天机器人API,于是就想着用abap试试连接一下,但是楼主abap基础太差,最终还是用java做了一个转发器,来实现聊天功能
先发一下效果
再来分享下实现代码,我这里是用的springboot快速创建了一个web服务,代码贴在下面
package com.cjq.demo.controller;
import java.nio.charset.Charset;
import java.util.Iterator;
import com.cjq.demo.model.InputText;
import com.cjq.demo.model.Perception;
import com.cjq.demo.model.RequestModel;
import com.cjq.demo.model.UserInfo;
import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.client.RestTemplate;
@RequestMapping("/test")
@Controller
public class DemoController {
@RequestMapping(value = "/demo", method = RequestMethod.GET)
@ResponseBody
public String test(@RequestBody String string) {
System.out.println(string);
RequestModel requestModel = new RequestModel();
InputText inputText = new InputText();
UserInfo userInfo = new UserInfo();
Perception perception = new Perception();
String url = "http://openapi.tuling123.com/openapi/api/v2";
inputText.setText(string);
perception.setInputText(inputText);
userInfo.setApiKey("你的apikey");
userInfo.setUserId("你的userid");
requestModel.setPerception(perception);
requestModel.setReqType(0);
requestModel.setUserInfo(userInfo);
Gson gson = new Gson();
String str = gson.toJson(requestModel);
RestTemplate restTemplate = new RestTemplate();
restTemplate.getMessageConverters().add(0,
(HttpMessageConverter<?>) new StringHttpMessageConverter(Charset.forName("UTF-8")));
String s = restTemplate.postForObject(url, str, String.class);
JsonObject js = new JsonParser().parse(s).getAsJsonObject();
JsonArray ss = js.getAsJsonArray("results");
Iterator it = ss.iterator();
while(it.hasNext()){
JsonElement e = (JsonElement)it.next();
System.out.println(e.getAsJsonObject().getAsJsonObject("values").get("text").toString());
return e.getAsJsonObject().getAsJsonObject("values").get("text").toString();
}
return "机器人调用失败了";
}
}
命名比较随意,看看就好哈,实体类的就不贴了,随便起。
再贴下abap的
REPORT Z01_01_03.
PARAMETERS INPUT TYPE STRING.
DATA:BEGIN OF TY_REQ,
STRING TYPE STRING,
END OF TY_REQ.
TY_REQ-STRING = INPUT.
DATA: LT_FLIGHT TYPE STANDARD TABLE OF SFLIGHT,
LRF_DESCR TYPE REF TO CL_ABAP_TYPEDESCR,
LV_JSON TYPE STRING.
LV_JSON = /UI2/CL_JSON=>SERIALIZE( DATA = TY_REQ COMPRESS = ABAP_TRUE PRETTY_NAME = /UI2/CL_JSON=>PRETTY_MODE-CAMEL_CASE ).
WRITE: / '你对虚拟小崔说: "', INPUT, '"'.
DATA: LO_HTTP_CLIENT TYPE REF TO IF_HTTP_CLIENT,
LV_SERVICE TYPE STRING,
LV_RESULT TYPE STRING,
LO_IXML TYPE REF TO IF_IXML,
LO_STREAMFACTORY TYPE REF TO IF_IXML_STREAM_FACTORY,
LO_ISTREAM TYPE REF TO IF_IXML_ISTREAM,
LO_DOCUMENT TYPE REF TO IF_IXML_DOCUMENT,
LO_PARSER TYPE REF TO IF_IXML_PARSER.
LV_SERVICE = 'http://你的ip地址:8080/test/demo?string='.
DATA CCC TYPE STRING.
CONCATENATE LV_SERVICE INPUT INTO CCC.
CL_HTTP_CLIENT=>CREATE_BY_URL(
EXPORTING
URL = LV_SERVICE
IMPORTING
CLIENT = LO_HTTP_CLIENT
EXCEPTIONS
ARGUMENT_NOT_FOUND = 1
PLUGIN_NOT_ACTIVE = 2
INTERNAL_ERROR = 3
OTHERS = 4 ).
LO_HTTP_CLIENT->PROPERTYTYPE_LOGON_POPUP = LO_HTTP_CLIENT->CO_DISABLED.
CALL METHOD LO_HTTP_CLIENT->AUTHENTICATE(
EXPORTING
* client = ''
* proxy_authentication = 'X'
USERNAME = ''
PASSWORD = ''
* LANGUAGE = 'E'
).
CALL METHOD LO_HTTP_CLIENT->REQUEST->SET_HEADER_FIELD
EXPORTING
NAME = 'Content-Type'
VALUE = 'application/json; charset=utf-8'.
CALL METHOD LO_HTTP_CLIENT->REQUEST->SET_METHOD( 'GET' ).
DATA LA_JSON TYPE STRING.
DATA: LEN TYPE I .
LA_JSON = INPUT.
LEN = STRLEN( LA_JSON ) .
CALL METHOD LO_HTTP_CLIENT->REQUEST->SET_CDATA
EXPORTING
DATA = INPUT
OFFSET = 0
LENGTH = LEN.
LO_HTTP_CLIENT->SEND(
EXCEPTIONS
HTTP_COMMUNICATION_FAILURE = 1
HTTP_INVALID_STATE = 2 ).
LO_HTTP_CLIENT->RECEIVE(
EXCEPTIONS
HTTP_COMMUNICATION_FAILURE = 1
HTTP_INVALID_STATE = 2
HTTP_PROCESSING_FAILED = 3 ).
CLEAR LV_RESULT .
LV_RESULT = LO_HTTP_CLIENT->RESPONSE->GET_CDATA( ).
LO_IXML = CL_IXML=>CREATE( ).
LO_STREAMFACTORY = LO_IXML->CREATE_STREAM_FACTORY( ).
LO_ISTREAM = LO_STREAMFACTORY->CREATE_ISTREAM_STRING(
LV_RESULT ).
LO_DOCUMENT = LO_IXML->CREATE_DOCUMENT( ).
LO_PARSER = LO_IXML->CREATE_PARSER(
STREAM_FACTORY = LO_STREAMFACTORY
ISTREAM = LO_ISTREAM
DOCUMENT = LO_DOCUMENT ).
LO_PARSER->PARSE( ).
WRITE: / '虚拟小崔说: ',LV_RESULT.
CLEAR INPUT.
CALL METHOD LO_HTTP_CLIENT->CLOSE.
总体的逻辑就是本地启动一个服务,然后abap这边通过调用你提供的接口,将参数传过去,并接收返回值即可,命名方面就别吐槽啦,真的是乱起的,以上