You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Z39.50协议的PresentResponse中设置OPACRecord对象

Z39.50 PresentResponse嵌入OPACRecord可行方案

核心实现逻辑是将OPACRecord作为结构化内容封装进NamePlusRecord允许传入的External对象中,完全符合Z39.50标准规范,无需修改现有接口结构,具体操作步骤如下:

  • 第一步:按照标准ASN.1定义构造完整的OPACRecord对象,按需填充书目记录、馆藏信息、流通状态、预约信息等业务字段。
  • 第二步:构造符合要求的External对象,三个核心属性配置如下:
    • direct-reference字段填写OPACRecord的官方分配OID:1.2.840.10003.5.1000.1,接收端通过该OID即可识别External中封装的内容类型为OPACRecord
    • encoding字段配置为当前交互使用的编码规则,常用为BER(基本编码规则),可根据双方协议约定调整为DER、PER等其他编码
    • single-ASN1-type字段直接传入第一步构造完成、序列化后的OPACRecord对象
  • 第三步:将填充完成的External对象传入NamePlusRecord实例,再将所有NamePlusRecord实例组装为列表,传入PresentResponse的Records参数即可完成构造。

接收端解析逻辑:读取NamePlusRecord下External对象的direct-referenceOID,匹配到OPACRecord的OID后,直接从single-ASN1-type字段反序列化即可拿到完整的OPACRecord结构,无需额外适配处理。

如果你使用YAZ工具栈开发,可以参考以下伪代码实现:

// 初始化OPACRecord并填充业务字段
OPACRecord *opac_rec = opac_record_create();
opac_record_set_bibliographic(opac_rec, biblio_rec);
opac_record_set_holdings(opac_rec, holdings_array, holdings_count);
opac_record_set_circulation_info(opac_rec, circ_info);

// 封装为External对象
Z_External *ext_obj = z_External_create();
ext_obj->direct_reference = oid_from_string("1.2.840.10003.5.1000.1");
ext_obj->encoding = Z_ENCODING_BER;
ext_obj->choice = Z_External_single_ASN1_type;
ext_obj->value.single_asn1_type = (void *)opac_rec;

// 组装到PresentResponse结构
Z_NamePlusRecord *npr = z_NamePlusRecord_create();
npr->choice = Z_NamePlusRecord_record;
npr->u.record = ext_obj;
// 将NamePlusRecord加入响应的Records列表
z_PresentResponse_add_record(present_resp, npr);

内容的提问来源于stack exchange,提问作者Prasad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 21:30:01