yaz4j连接图书馆的URL参数格式及使用方法咨询
ZgateServlet 参数格式规范详解(基于 YAZ4J Z39.50 网关)
我来帮你拆解这几个Z39.50网关请求参数的格式规则,结合你提供的ZgateServlet代码,逐一说明每个参数的定义和使用规范:
1. zurl 参数格式
zurl是Z39.50服务器的连接地址,格式遵循[主机名]:[端口]/[数据库名]的结构:
- 主机名:Z39.50服务器的域名或IP地址,比如示例中的
z3950.loc.gov - 端口:Z39.50服务监听的端口,标准端口是210,但示例中用的是7090(国会图书馆的特定端口)
- 数据库名:目标服务器上的具体数据库实例,比如示例中的
voyager(国会图书馆的馆藏数据库)
如果服务器有默认数据库,也可以省略数据库名,直接使用[主机名]:[端口]的格式,但建议明确指定数据库名以避免歧义。
在你的Servlet代码中,Connection con = new Connection(zurl, 0)的第二个参数0是备用端口,因为zurl已经包含了端口信息,所以这里会被忽略。
2. query 参数格式(Prefix Query 语法)
你的代码中指定了Connection.QueryType.PrefixQuery,这对应YAZ的前缀查询语法,是Z39.50协议中用于属性化查询的标准格式,示例中的@attr 1=7 0253333490就是典型用法:
基础结构
@attr [属性集编号]=[属性类型] [查询值]
@attr:固定前缀,标记这是一个属性查询- 属性集编号:常用的是
1(代表Bib-1属性集,图书馆界通用的元数据属性集) - 属性类型:对应Bib-1集中的具体字段,比如
7代表ISBN(国际标准书号) - 查询值:要检索的具体内容,比如示例中的
0253333490
常见Bib-1属性类型(部分)
1=1:作者1=4:标题1=7:ISBN1=8:ISSN1=21:主题词
多条件组合查询
可以用and/or连接多个属性查询条件,比如:
@attr 1=4 "The Hobbit" and @attr 1=1 "Tolkien"
注意:如果查询值包含空格,需要用双引号包裹。
3. syntax 参数可选值
syntax用于指定返回记录的格式,YAZ4J支持的常见格式(需目标Z39.50服务器支持)包括:
usmarc:美国机读目录格式,示例中使用的格式,是图书馆领域广泛使用的MARC格式marcxml:MARC格式的XML版本,更易于程序解析dc:Dublin Core(都柏林核心元数据),通用的轻量级元数据格式xml:通用XML格式(取决于服务器配置)raw:原始字节格式(不推荐,除非你能处理原始MARC字节流)
如果指定的格式服务器不支持,会抛出ZoomException,建议提前确认目标服务器支持的格式列表,或优先尝试usmarc、marcxml这类通用格式。
额外说明:maxrecs 参数
虽然你没专门提问,但代码中包含了这个可选参数:
- 作用:指定返回的最大记录数,默认值为10
- 格式:必须是正整数,如果传入非数字值,Servlet会返回400错误
你的ZgateServlet代码(格式化后)
package web; /* * Copyright (c) 1995-2010, Index Data * All rights reserved. * See the file LICENSE for details. */ import org.yaz4j.Connection; import org.yaz4j.Record; import org.yaz4j.ResultSet; import org.yaz4j.exception.ZoomException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; /** * * @author jakub */ public class ZgateServlet extends HttpServlet { @Override public void init() throws ServletException { System.out.println("Zeta: java.library.path=" + System.getProperty("java.library.path")); System.out.println("Zeta: LD_LIBRARY_PATH=" + System.getenv("LD_LIBRARY_PATH")); } @Override /* * For dinosaur search use: ?zurl=z3950.loc.gov:7090/voyager&query=@attr 1=7 0253333490&syntax=usmarc * */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String zurl = request.getParameter("zurl"); if (zurl == null || zurl.isEmpty()) { response.sendError(400, "Missing parameter 'zurl'"); return; } String query = request.getParameter("query"); if (query == null || query.isEmpty()) { response.sendError(400, "Missing parameter 'query'"); return; } String syntax = request.getParameter("syntax"); if (syntax == null || syntax.isEmpty()) { response.sendError(400, "Missing parameter 'syntax'"); return; } int maxrecs=10; if (request.getParameter("maxrecs") != null && !request.getParameter("maxrecs").isEmpty()) { try { maxrecs = Integer.parseInt(request.getParameter("maxrecs")); } catch (NumberFormatException nfe) { response.sendError(400, "Malformed parameter 'maxrecs'"); return; } } response.getWriter().println("SEARCH PARAMETERS"); response.getWriter().println("zurl: " + zurl); response.getWriter().println("query: " + query); response.getWriter().println("syntax: " + syntax); response.getWriter().println("maxrecs: " + maxrecs); response.getWriter().println(); Connection con = new Connection(zurl, 0); con.setSyntax(syntax); try { con.connect(); ResultSet set = con.search(query, Connection.QueryType.PrefixQuery); response.getWriter().println("Showing " + maxrecs + " of " +set.getHitCount()); response.getWriter().println(); for(int i=0; i<set.getHitCount() && i<maxrecs; i++) { Record rec = set.getRecord(i); if (rec == null) continue; response.getWriter().print(rec.render()); } } catch (ZoomException ze) { throw new ServletException(ze); } finally { con.close(); } } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } @Override public String getServletInfo() { return "Zeta search engine servlet"; } }
内容的提问来源于stack exchange,提问作者user8938126
相关产品推荐
相关产品推荐

