如何在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中封装的内容类型为OPACRecordencoding字段配置为当前交互使用的编码规则,常用为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
相关产品推荐
相关产品推荐

