You need to enable JavaScript to run this app.
导航

下发回传接口(callback)

最近更新时间2023.08.02 20:11:59

首次发布时间2022.04.13 17:53:20

下发回传接口用于记录已推荐结果,在以后的推荐返回中对已推荐结果去重。
以电商行业举例,推荐接口返回推荐商品id列表[1,2,3,4,5],客户服务端判断商品3刚刚售罄,根据运营规则需要在第二位强制插入商品10,最终将商品id列表[1,10,2,4,5]下发给客户端,那么客户侧需要同时将商品id列表[1,10,2,4,5,3] 通过本接口上报。注意:这里需要将被过滤的商品3以及强插商品10都返回,同时给不同的item附带相应的extra字段。 同一次下发的推荐结果必须一次性上报

调用方法

Callback(request *CallbackRequest, opts …option.Option) (*CallbackResponse, error)

方法参数

参数

类型

说明

request

CallbackRequest

请求体,包含参数见下表,具体使用方式见用例示范

opts

[]option.Option

请求中可选参数,具体使用方式见用例示范

request请求体参数:

参数
类型
是否必传
描述
uid
string
用户id。
scene
string
callback对应的推荐场景,非特殊情况下均为default。
items
object list
需要回调的物品列表。
predictRequestId
string
强烈建议传输。当前callback请求对应的predict请求的Request-Id。例如:调用推荐接口时候的Request-Id为hr3sd12ui23478sd,那么对应的下发回传请求的此参数需填写为hr3sd12ui23478sd。如果此参数未填写,字节侧会尝试使用header里的Request-Id来匹配寻找对应的predict请求。
context
string
上下文信息

方法返回

使用自定义的CallbackResponse类作为响应类型,具体参数如下表所示。在获取到CallbackResponse类型的返回值后可调用它的isSuccess()方法判断此次数据上传是否成功。

参数

类型

说明

获取方法

code

int

状态码

getCode

message

String

请求结果信息

getMessage

示例

注意

一个推荐请求应该仅对应一个callback请求。如果同一个predictRequestId出现两次callback请求,容易引起预期外的结果。

import (
   "github.com/google/uuid"
   "github.com/volcengine/volcengine-sdk-go-rec/byteair"
   "github.com/volcengine/volcengine-sdk-go-rec/byteair/protocol"
   "github.com/volcengine/volcengine-sdk-go-rec/core/logs"
   "github.com/volcengine/volcengine-sdk-go-rec/core/option"
)


// 已经初始化好的client.示例省略init()
var client byteair.Client


func Callback() {
   // 请求体
   req := &protocol.CallbackRequest{
      Uid:   "uid1",
      Scene: "default",
      Items: []*protocol.CallbackItem{
         {
            Id:    "item_id1",
            Pos:   "pos1",
            Extra: "{\"reason\":\"exposure\"}",
         },
         {
            Id:    "item_id1",
            Pos:   "pos1",
            Extra: "{\"reason\":\"filter\"}",
         },
      },
      PredictRequestId: "ds12ad61hnwo",
      Context: &protocol.CallbackContext{
         Spm:   "A$##$B$##$C",
         Extra: map[string]string{"extra_key": "extra_value"},
      },
      Extra: nil,
   }
   opts := []option.Option{
      option.WithRequestId(uuid.NewString()),
      // 是否开启SPM路由.开启的话需要保证请求体里的SPM存在且绑定了栏位.
      // server会根据body里的SPM路由到选择的栏位.
      option.WithHeaders(map[string]string{
         "Enable-spm-route": "true",
      }),
   }
   rsp, err := client.Callback(req, opts...)
   if err != nil {
      logs.Error("[callback] occur error, msg: %s", err.Error())
      return
   }
   if !rsp.GetSuccess() {
      logs.Error("[callback] failure")
      return
   }
   logs.Info("[callback] success")
}