1

在我的应用程序中,我必须使用路由 Web 服务并使用 OSRM Server API

https://github.com/Project-OSRM/osrm-backend/wiki/Server-api

我不知道为什么,但直到昨天才知道 Server-api 工作正常。现在它不起作用,它给了我一个错误的请求

http://router.project-osrm.org/viaroute?loc= "+p.getLat()+","+p.getLon()+"&loc="+d.getLat()+","+d .getLon(); 我使用 java 和 REST 协议

String sito="http://router.project-osrm.org/viaroute?loc="+p.getLat()+","+p.getLon()+"&loc="+d.getLat()+","+d.getLon()";
       Client client = ClientBuilder.newClient();

                WebTarget target = client.target(sito);


                Response res = target.request().get();


               System.out.println(res.readEntity(String.class));

我获得了“BAD GATEWAY”

4

1 回答 1

0

在@scai 提供的链接中查看萤火虫,您可以看到Content-Encoding== gzip。您应该设置Accept-Encoding标题。您可以acceptEncodingInvocationBuilder. 所以做类似的事情

    WebTarget target = client.target(uri);
    String response = target.request()
            .accept("application/json")
            .acceptEncoding("gzip")
            .get(String.class);

不确定您使用的 JAX-RS 客户端库,但标准客户端 API 没有任何过滤器/拦截器来解码 gzip,但如果您使用的是 Jersey 客户端,那么您可以GZipEncoder向客户端注册。

client.register(org.glassfish.jersey.message.GZipEncoder.class);

经过测试,这对我来说很好。在进行上述更改之前遇到了与您相同的问题。

如果您不使用 Jersey,我确定您使用的任何实现都应该有一些 GZIP 过滤器。我知道 Resteasy 可以。如果您的实现没有,您总是可以使用 JavaGZIPInputStream来包装响应流

Response response = target.request()
        .accept("application/json")
        .acceptEncoding("gzip")
        .get();

GZIPInputStream is = new GZIPInputStream(
                          response.readEntity(InputStream.class));
于 2015-01-25T13:50:57.743 回答