Java Jena:如何显式指定由RDFDataMgr.loadModel(url)发送的Accept头?

Java Jena:如何显式指定由RDFDataMgr.loadModel(url)发送的Accept头?,java,http-headers,rdf,jena,Java,Http Headers,Rdf,Jena,我们需要使用错误的Http内容协商查询服务器(它不理解Accept标头中的q参数)。因此,我们需要将查询与 Accept:application/rdf+xml 而不是耶拿的违约 Accept:text/turtle,application/n-triples;q=0.9,应用程序/rdf+xml;q=0.7,应用程序/触发器,应用程序/四象限;q=0.9,text/x-nquads;q=0.8,应用/x-触发;q=0.7,应用程序/ld+json;q=0.6,*/*;q=0.5 下面是我们目前

我们需要使用错误的Http内容协商查询服务器(它不理解Accept标头中的q参数)。因此,我们需要将查询与

Accept:application/rdf+xml

而不是耶拿的违约

Accept:text/turtle,application/n-triples;q=0.9,应用程序/rdf+xml;q=0.7,应用程序/触发器,应用程序/四象限;q=0.9,text/x-nquads;q=0.8,应用/x-触发;q=0.7,应用程序/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(“应用程序/rdf+xml”)用于所有请求?

函数
QueryExecutionFactory.sparqlService
返回一个
QueryExecution
对象,该对象实际上是一个
QueryEngineHTTP
,具有
set*ContentType
方法


如果你想进入真正详细的控制,您可以将
HttpOp
直接与
HttpResponseHandler
一起使用,后者将输入流传递给
RDFDataMgr
函数
QueryExecutionFactory。sparqlService
返回一个
QueryExecution
对象,该对象实际上是
QueryEngineHTTP
,并且有
set*ContentType
方法


如果您想进入真正详细的控制,可以直接使用
HttpOp
HttpResponseHandler
将输入流传递到
RDFDataMgr

此代码执行以下任务:

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) {
    ...

此代码执行以下任务:

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) {
    ...

非常感谢,安迪。第二种方法对我来说是正确的,因为我只是解决URI,没有SPARQL。非常感谢,安迪。第二种方法对我来说是正确的,因为我只是解析URI,而不是SPARQL。