Вызов API Google Geocode в службе REST в Джерси вызывает внутреннюю ошибку 400 - PullRequest
1 голос
/ 03 июля 2019

У меня возникла проблема с попыткой доступа к Google Geocode API из-за вызова службы REST джерси в моем бэкэнде. Когда я это делаю, это вызывает внутреннюю ошибку HTTP 400 на сервере Тем не менее, вызов API Geocode напрямую через браузер или клиентский вызов работает Кроме того, также работает вызов службы REST из джерси, которая вызывает другую службу отдыха из джерси. Прямой вызов на что-нибудь работает. Вложение сервиса джерси в другой сервис джерси работает. Но не удается вставить вызов API Google в сервис джерси.

Звонок в службу определения местоположения («А»)

JerseyClient client = JerseyClientBuilder.newClient();

JerseyWebTarget webTarget = client.target("http://localhost:8080/arenamaster-backend/api").path("tournaments").path("location");

JerseyInvocation.Builder invocationBuilder = webTarget.request(MediaType.APPLICATION_JSON);

String input = "10621 Braddock Road – Ste B, Fairfax, VA 22032";

Response response = invocationBuilder
                .post(Entity.entity(input, MediaType.TEXT_PLAIN));

Служба определения местоположения: ("B")

@POST
@Path("/location")
@Consumes(MediaType.TEXT_PLAIN)
@Produces(MediaType.APPLICATION_JSON)
@CrossOrigin
public Response getLatLngFromAddress(String address) {
    LatLng latlng = LocationUtility.geocode(address);

    return Response.status(200).entity(latlng).build();     
}

Прямой вызов геокодера утилиты определения местоположения ("C")

String address = "10621 Braddock Road – Ste B, Fairfax, VA 22032";

LatLng latlng= LocationUtility.geocode(address); 

System.out.println(latlng);

Функция геокодирования, которая вызывает Google Geocode API ("D")

public static LatLng geocode(String address) {
    String address_key = address.replace(' ', '+');                 
    String API_key = "***hidden***";            

    String request = "https://maps.googleapis.com/maps/api/geocode/json?address=" + address_key + "&key=" + API_key;
    JerseyClient client = JerseyClientBuilder.newClient();

    JerseyWebTarget webTarget = client.target(request);

    JerseyInvocation.Builder invocationBuilder = webTarget.request(MediaType.APPLICATION_JSON);

    Response response = invocationBuilder
            .get(Response.class);

    if (response.getStatus()/100 != 2) {
        throw new RuntimeException("Failed : HTTP error code : "
                + response.getStatus());
    }

    String output = response.readEntity(String.class);

    LatLng latlng = null;

    try {
        JSONObject geocode = new JSONObject(output);
        JSONArray results = geocode.getJSONArray("results");
        JSONObject address_components = (JSONObject) results.get(0);
        JSONObject geometry = (JSONObject) address_components.get("geometry");
        JSONObject location = (JSONObject) geometry.get("location");
        latlng = new LatLng(location.getDouble("lat"), location.getDouble("lng"));
    }catch(Exception e) {
        e.printStackTrace();
    }

    return latlng;
}

Вызов в тестовом образце вызова ("E")

//call within a call sample test
JerseyClient client = JerseyClientBuilder.newClient();

JerseyWebTarget webTarget = client.target("http://localhost:8080/arenamaster-backend/api").path("test").path("func1");

JerseyInvocation.Builder invocationBuilder = webTarget.request(MediaType.TEXT_PLAIN);


Response response = invocationBuilder
    .get(Response.class);

if (response.getStatus()/100 != 2) {
    throw new RuntimeException("Failed : HTTP error code : "
        + response.getStatus());
}

System.out.println("Output from Server .... \n");
String output = response.readEntity(String.class);
System.out.println(output);

Позвонить в течение вызова двум конечным точкам службы тестирования ("F")

@GET
@Path("/func1")
@Produces(MediaType.TEXT_PLAIN)
@CrossOrigin
public Response testFunc1() {
    System.out.println("1st service invoked");
    String response = "";

    response = TestDAO.callSecondService();

    return Response.status(200).entity(response).build();
}

@GET
@Path("/func2")
@Produces(MediaType.TEXT_PLAIN)
@CrossOrigin
public Response testFunc2() {
    System.out.println("2nd service invoked");
    String response = "";

    response = TestDAO.getMessage();

    return Response.status(200).entity(response).build();
}

Вызов в пределах функции проверки вызова: ("G")

public static String callSecondService() {

    JerseyClient client = JerseyClientBuilder.newClient();

    JerseyWebTarget webTarget = client.target("http://localhost:8080/arenamaster-backend/api").path("test").path("func2");

    JerseyInvocation.Builder invocationBuilder = webTarget.request();


    Response response = invocationBuilder
            .get(Response.class);

    if (response.getStatus()/100 != 2) {
        throw new RuntimeException("Failed : HTTP error code : "
                + response.getStatus());
    }

    System.out.println("Output from Server .... \n");
    String output = response.readEntity(String.class);
    System.out.println(output);

    return output;
}

public static String getMessage() {
    return "Success!"; 
}

C-D успешно E-F-G успешно Сбой A-B-D и распечатывает приведенную ниже трассировку стека на консоли сервера

    java.lang.RuntimeException: Failed : HTTP error code : 400
at utilities.LocationUtility.geocode(LocationUtility.java:38)
at services.TournamentAlphaService.getLatLngFromAddress(TournamentAlphaService.java:91)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory.lambda$static$0(ResourceMethodInvocationHandlerFactory.java:52)
at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher$1.run(AbstractJavaResourceMethodDispatcher.java:124)
at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:167)
at org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$ResponseOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:176)
at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:79)
at org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:469)
at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:391)
at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:80)
at org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:253)
at org.glassfish.jersey.internal.Errors$1.call(Errors.java:248)
at org.glassfish.jersey.internal.Errors$1.call(Errors.java:244)
at org.glassfish.jersey.internal.Errors.process(Errors.java:292)
at org.glassfish.jersey.internal.Errors.process(Errors.java:274)
at org.glassfish.jersey.internal.Errors.process(Errors.java:244)
at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:265)
at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:232)
at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:680)
at org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:392)
at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:346)
at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:365)
at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:318)
at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:205)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:493)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:650)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:800)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:806)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1498)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)

Обновление:

Проверка вызова в режиме вызова (E-F-G) работает правильно, если следующая строка

WebTarget webTarget = client.target("http://localhost:8080/arenamaster-backend/api").path("test").path("func3"); Заменяется на это: WebTarget webTarget = client.target("https://en.wikipedia.org/wiki/List_of_HTTP_status_codes");

1 Ответ

0 голосов
/ 07 июля 2019

Чтение тела показало, что Google Geocode API не принимает кодировку символов не-UTF-8.Мне пришлось изменить эту строку, чтобы она работала:

String request = "https://maps.googleapis.com/maps/api/geocode/json?address=" + new URLEncoder().encode(address_key, Charset.availableCharsets().get("UTF-8")) + "&key=" + API_key;
...