Каков наилучший способ обработки ответа GraphQl в Java? - PullRequest
0 голосов
/ 11 июня 2019

В унаследованном приложении с Java 6 я вызываю API GraphQl с использованием Spring RestTemplate, теперь я хотел бы знать, каков наилучший способ обработки ответа, когда GraphQl всегда выдаст ответ с StatusCode 200 в случае успехаили ошибка, и разница в том, что внутри ответа тела будет строка с «данными» для успеха и «ошибками» для ошибок.Я думал, что смогу получить ответ и преобразовать его в String, проверить с помощью «contains» и проверить, есть ли «data» или «errors» внутри тела ответа, но я не знаю, является ли это лучшим способом.Приведенный ниже код показывает, как приложение Java вызывает API GraphQl:

ResponseEntity<?> response = restTemplate.exchange(url, HttpMethod.POST, httpEntity, String.class);

Способ, который я решил обработать:

if (response.getBody().toString().contains("errors")){
    handleException
}

1 Ответ

1 голос
/ 12 июня 2019

GraphQL выдаст тело ответа в следующем формате JSON

{
  "data": { ... },
  "errors": [ ... ]
}

Если были ошибки, в нем будут поля ошибок.

Таким образом, это плохая идея, поскольку вы проверяете, содержит ли весь ответ JSON строку errors, а не поле errors. В случае успеха он определенно потерпит неудачу только потому, что data содержит строку errors (например, представьте, что это запрос пользователя get, но пользователь использует errors в качестве своего логина)

Вы должны разобрать тело ответа в объект JSON и проверить, содержит ли JSON поле с именем errors или нет.

Если у вас есть Jackson в пути к классам, RestTemplate обнаружит его и автоматически настроит для анализа JSON, что позволит вам сделать что-то вроде:

ResponseEntity<Map<String,Object>> response = restTemplate.exchange(url, HttpMethod.POST, httpEntity, Map.class);
Map<String,Object> body = response.getBody();
if(body.containsKey("errors")){
   //handleException
}
...