使用ABAP调用图灵api制作个简单的聊天机器人

本文介绍如何使用ABAP调用图灵聊天机器人API,通过SpringBoot搭建中转服务,实现聊天功能。作者因ABAP基础薄弱,采用Java作为接口转发器。

使用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这边通过调用你提供的接口,将参数传过去,并接收返回值即可,命名方面就别吐槽啦,真的是乱起的,以上

### 在ABAP调用DeepSeek API以实现附件传输的解决方案 在ABAP调用DeepSeek API以实现附件传输,通常需要通过HTTP或HTTPS请求将文件作为二进制数据上传到API端点。以下是一个完整的解决方案和示例代码。 #### 1. 获取DeepSeek API的访问权限 确保你已经获取了DeepSeek API的访问权限,并了解其端点、请求格式以及认证方式(如API密钥)。API密钥应存储在安全的位置[^3],例如自定义数据库表中,并确保只有授权用户能够访问。 #### 2. 创建HTTP客户端并设置请求头 使用ABAP中的`CL_HTTP_CLIENT`类创建HTTP客户端,并设置必要的请求头,包括认证信息(如API密钥)。 #### 3. 处理文件上传 在ABAP中,可以通过读取文件内容并将其转换为二进制数据来实现文件上传。以下是一个示例代码,展示如何从本地系统读取文件并通过HTTP请求上传到DeepSeek API。 ```abap DATA: lo_http_client TYPE REF TO if_http_client, lv_url TYPE string VALUE 'https://api.deepseek.com/upload', lv_api_key TYPE string, lv_file_name TYPE string VALUE '/path/to/your/file.txt', lv_mime_type TYPE string VALUE 'text/plain', lv_response TYPE string. TRY. " 从自定义数据库表中读取API密钥 SELECT SINGLE api_key INTO lv_api_key FROM zcustom_api_keys WHERE id = 'DEEPSEEK'. IF sy-subrc NE 0. RAISE EXCEPTION TYPE cx_root MESSAGE 'API Key not found in secure storage'. ENDIF. " 创建HTTP客户端 cl_http_client=>create_by_url( EXPORTING url = lv_url IMPORTING client = lo_http_client ). " 设置请求头 lo_http_client->set_header_field( name = 'Authorization' value = 'Bearer ' && lv_api_key ). lo_http_client->set_header_field( name = 'Content-Type' value = 'multipart/form-data' ). " 读取文件内容 DATA: lv_file_content TYPE xstring. CALL FUNCTION 'SCMS_FILE_READ' EXPORTING filename = lv_file_name IMPORTING filecontent = lv_file_content EXCEPTIONS failed_open = 1 read_error = 2 OTHERS = 3. IF sy-subrc NE 0. RAISE EXCEPTION TYPE cx_root MESSAGE 'Error reading file content'. ENDIF. " 将文件内容作为二进制数据发送 lo_http_client->send( EXPORTING method = 'POST' body = lv_file_content ). " 接收响应 lo_http_client->receive( IMPORTING data = lv_response ). " 输出响应 WRITE: / 'Response from DeepSeek API:', lv_response. CATCH cx_root INTO DATA(lx_error). WRITE: / 'Error:', lx_error->get_text( ). ENDTRY. ``` #### 4. 安全性注意事项 - API密钥应始终存储在安全位置,例如自定义数据库表中[^3],并确保只有授权用户能够访问。 - 禁用生产系统中普通用户的调试权限和执行敏感事务码(如`SQVI`)的权限。 - 使用HTTPS协议进行通信以确保数据传输的安全性。 #### 5. 示例说明 上述代码展示了如何从本地系统读取文件内容并将其作为二进制数据上传到DeepSeek API。需要注意的是,API的具体端点和请求格式可能因DeepSeek API的版本而有所不同,请参考DeepSeek API文档[^1]以获取最新信息。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值