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

下发回传接口(callback)

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

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

下发回传接口用于记录已推荐结果,在以后的推荐返回中对已推荐结果去重。
以电商行业举例,推荐接口返回推荐商品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字段。 同一次下发的推荐结果必须一次性上报

调用方法

CallbackResponse callback(CallbackRequest request, Option... opts)

方法参数

参数

类型

说明

request

CallbackRequest

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

opts

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
上下文信息

方法返回

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

参数
类型
描述
code
int32
0或200代表正常,不等同于http status,用于排查业务错误
message
string
状态信息,默认"OK",遇到错误会返回错误信息

示例

注意

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

import com.alibaba.fastjson.JSON;
import volcengine.byteair.ByteairClient;
import volcengine.byteair.ByteairClientBuilder;
import volcengine.byteair.protocol.VolcengineByteair;
import volcengine.core.BizException;
import volcengine.core.NetException;
import volcengine.core.Option;
import volcengine.core.Region;
import volcengine.core.metrics.MetricsCollector;

import java.util.*;


public class Example {


    public static ByteairClient byteairClient;


    // 示例省略public static void init()
    // 某些语法可能在低版本JDK报错,请根据需求替换成等价语法.
    public static void callback() {
        // 请求体
        List<VolcengineByteair.CallbackItem> callbackItems = new ArrayList<>();
        callbackItems.add(VolcengineByteair.CallbackItem.newBuilder()
                .setId("item_id1")
                .setPos("position1")
                .setExtra(JSON.toJSONString(new HashMap<String, String>() {{
                    put("reason", "exposure");
                }}))
                .build());
        callbackItems.add(VolcengineByteair.CallbackItem.newBuilder()
                .setId("item_id2")
                .setPos("position2")
                .setExtra(JSON.toJSONString(new HashMap<String, String>() {{
                    put("reason", "filter");
                }}))
                .build());
        VolcengineByteair.CallbackContext callbackContext = VolcengineByteair.CallbackContext.newBuilder()
                .setSpm("A$##$B$##$C")
                .putExtra("extra_key", "extra_value")
                .build();
        VolcengineByteair.CallbackRequest callbackRequest = VolcengineByteair.CallbackRequest.newBuilder()
                // 对应的predict请求的request id
                .setPredictRequestId("xxx")
                // 对应的predict请求的uid
                .setUid("uid1")
                // 设置上下文
                .setContext(callbackContext)
                // 对应的predict请求的scene.
                .setScene("default")
                // 对应的predict请求的items列表
                .addAllItems(callbackItems)
                .build();

    
        Option[] opts = new Option[]{
                // 标识callback请求自己的request id,和callback请求体里的predict request id含义不同.
                Option.withRequestId(UUID.randomUUID().toString()),
                // 是否开启SPM路由.开启的话需要保证请求体里的SPM存在且绑定了栏位.
                // server会根据body里的SPM路由到选择的栏位.
                Option.withHeaders(new HashMap<>() {{
                    put("Enable-Spm-Route", "true");
                }})
        };

    
        VolcengineByteair.CallbackResponse callbackResponse;
        try {
            callbackResponse = byteairClient.callback(callbackRequest, opts);
        } catch (NetException | BizException e) {
            System.out.printf("[callback] occur error, msg:%s \n", e.getMessage());
            return;
        }
        if (!callbackResponse.getSuccess()) {
            System.out.println("[callback] failure");
            return;
        }
        System.out.println("[callback] success");
    }
}