Jena:如何明确指定 RDFDataMgr.loadModel(url) 发送的 Accept Header?
Jena: How to explicitly specify Accept Header sent by RDFDataMgr.loadModel(url)?
我们需要查询一个有问题的 Http Content Negotiation 的服务器(它不理解 Accept Header 中的 q 参数)。所以我们需要用
发送查询
Accept:application/rdf+xml
而不是 Jena 的默认值
Accept: text/turtle,application/n-triples;q=0.9,application/rdf+xml;q=0.7,application/trig,application/n-quads;q=0.9,text/x-nquads;q=0.8,application/x-trig;q=0.7,application/ld+json;q=0.6,*/*;q=0.5
这是我们目前用来设置 Jena 的 Http 处理的 Java 代码:
static {
HttpOp.setDefaultHttpClient(createHttpClient(1000, 4000));
}
protected static HttpClient createHttpClient(final int connectTimeout, final int readTimeout) {
final RequestConfig requestConfig = RequestConfig.custom()
.setConnectTimeout(connectTimeout)
.setSocketTimeout(readTimeout)
.setContentCompressionEnabled(true)
.setRedirectsEnabled(true)
.build();
final HttpHost gndHost = new HttpHost("host.net", 80);
final PoolingHttpClientConnectionManager connMgr = new PoolingHttpClientConnectionManager();
connMgr.setDefaultMaxPerRoute(10);
connMgr.setMaxTotal(50);
connMgr.setMaxPerRoute(new HttpRoute(gndHost), 2);
return HttpClientBuilder.create()
.setConnectionManager(connMgr)
.setDefaultRequestConfig(requestConfig)
.build();
}
是否可以更改此常规设置,以便将 HttpQuery.setAccept("application/rdf+xml") 用于所有请求?
函数 QueryExecutionFactory.sparqlService
returns 一个 QueryExecution
对象,它实际上是一个 QueryEngineHTTP
,并且有 set*ContentType
个方法。
如果您想进行真正详细的控制,可以直接使用 HttpOp
和将输入流传递给 RDFDataMgr
的 HttpResponseHandler
。
此代码完成工作:
private Model fetchRemoteData(final String uri, final Boolean ignoreErrors) throws HttpException, TitleDataInvalidException {
try {
final Model rdfModel;
if (uri.startsWith("http://d-nb.info")) {
final Model tmpModel = ModelFactory.createDefaultModel();
final TypedInputStream is = HttpOp.execHttpGet(uri, "application/rdf+xml");
tmpModel.read(is, null);
rdfModel = tmpModel;
} else {
rdfModel = RDFDataMgr.loadModel(uri);
}
return rdfModel;
} catch (RiotException ex) {
...
我们需要查询一个有问题的 Http Content Negotiation 的服务器(它不理解 Accept Header 中的 q 参数)。所以我们需要用
发送查询Accept:application/rdf+xml
而不是 Jena 的默认值
Accept: text/turtle,application/n-triples;q=0.9,application/rdf+xml;q=0.7,application/trig,application/n-quads;q=0.9,text/x-nquads;q=0.8,application/x-trig;q=0.7,application/ld+json;q=0.6,*/*;q=0.5
这是我们目前用来设置 Jena 的 Http 处理的 Java 代码:
static {
HttpOp.setDefaultHttpClient(createHttpClient(1000, 4000));
}
protected static HttpClient createHttpClient(final int connectTimeout, final int readTimeout) {
final RequestConfig requestConfig = RequestConfig.custom()
.setConnectTimeout(connectTimeout)
.setSocketTimeout(readTimeout)
.setContentCompressionEnabled(true)
.setRedirectsEnabled(true)
.build();
final HttpHost gndHost = new HttpHost("host.net", 80);
final PoolingHttpClientConnectionManager connMgr = new PoolingHttpClientConnectionManager();
connMgr.setDefaultMaxPerRoute(10);
connMgr.setMaxTotal(50);
connMgr.setMaxPerRoute(new HttpRoute(gndHost), 2);
return HttpClientBuilder.create()
.setConnectionManager(connMgr)
.setDefaultRequestConfig(requestConfig)
.build();
}
是否可以更改此常规设置,以便将 HttpQuery.setAccept("application/rdf+xml") 用于所有请求?
函数 QueryExecutionFactory.sparqlService
returns 一个 QueryExecution
对象,它实际上是一个 QueryEngineHTTP
,并且有 set*ContentType
个方法。
如果您想进行真正详细的控制,可以直接使用 HttpOp
和将输入流传递给 RDFDataMgr
的 HttpResponseHandler
。
此代码完成工作:
private Model fetchRemoteData(final String uri, final Boolean ignoreErrors) throws HttpException, TitleDataInvalidException {
try {
final Model rdfModel;
if (uri.startsWith("http://d-nb.info")) {
final Model tmpModel = ModelFactory.createDefaultModel();
final TypedInputStream is = HttpOp.execHttpGet(uri, "application/rdf+xml");
tmpModel.read(is, null);
rdfModel = tmpModel;
} else {
rdfModel = RDFDataMgr.loadModel(uri);
}
return rdfModel;
} catch (RiotException ex) {
...