0

Пытаюсь получить с этого сайта ответ https://some-random-api.ml/facts/dog Должен приходить джейсон, но приходит 403 статусный код, не понимаю, в чем ошибка

 @GetMapping("/shelter")
public String getShelterPage(Authentication authentication, Model model){
 if(authentication != null){
 String a = getJSON("https://some-random-api.ml/facts/dog");
 String fact = null;
 if (a != null) {
 fact = a.substring(9,a.length()-3);
 }
 model.addAttribute("authentication", authentication);
 model.addAttribute("fact",fact);
 System.out.println(a);
 }
 return "shelter";
}
 public static String getJSON(String urle) {
 try {
 URL url = new URL(urle);
 HttpURLConnection con = (HttpURLConnection) url.openConnection();
 con.setRequestMethod("GET");
 con.setRequestProperty("Content-length", "0");
 con.setConnectTimeout(30000);
 con.connect();
 int resp = con.getResponseCode();
 System.out.println(resp);
 if(resp == 200) {
 BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream()));
 String line;
 StringBuilder sb = new StringBuilder();
 while ((line = br.readLine()) != null) {
 sb.append(line);
 sb.append("\n");
 }
 br.close();
 return sb.toString();
 } else {
 /*Log.e("RESP", "Ответ сервера: " + resp);*/
 }
 } catch(Exception e) { e.printStackTrace(); }
 return null;
}

}

freemarker.core.InvalidReferenceException: The following has evaluated to null or missing: ==> fact [in template "shelter.ftlh" at line 20, column 22]

Tip: If the failing expression is known to legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)??


FTL stack trace ("~" means nesting-related):

- Failed at: ${fact} [in template "shelter.ftlh" at line 20, column 20]

задан 25 апр. 2020 в 12:09

1 ответ 1

0

Все потому, что вы не установили юзер агента. Добавьте эту строку и все заработает

con.setRequestProperty("User-Agent", "Mozilla/5.0");

Вот код для того, чтобы проверить, что 403 действительно нет без спринга и прочих зависимостей:

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class Test {
 public static void main(String[] args) {
 getShelterPage();
 }
 //@GetMapping("/shelter")
 public static String getShelterPage(){//(Authentication authentication, Model model) {
 //if (authentication != null) {
 String a = getJSON("https://some-random-api.ml/facts/dog");
 String fact = null;
 if (a != null) {
 fact = a.substring(9, a.length() - 3);
 }
 //model.addAttribute("authentication", authentication);
 //model.addAttribute("fact", fact);
 System.out.println(a);
 //}
 return "shelter";
 }
 public static String getJSON(String urle) {
 try {
 URL url = new URL(urle);
 HttpURLConnection con = (HttpURLConnection) url.openConnection();
 con.setRequestMethod("GET");
 con.setRequestProperty("Content-length", "0");
 con.setRequestProperty("User-Agent", "Mozilla/5.0");
 con.setConnectTimeout(30000);
 con.connect();
 int resp = con.getResponseCode();
 System.out.println(resp);
 if (resp == 200) {
 BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream()));
 String line;
 StringBuilder sb = new StringBuilder();
 while ((line = br.readLine()) != null) {
 sb.append(line);
 sb.append("\n");
 }
 br.close();
 return sb.toString();
 } else {
 /*Log.e("RESP", "Ответ сервера: " + resp);*/
 }
 } catch (Exception e) {
 e.printStackTrace();
 }
 return null;
 }
}
ответ дан 25 апр. 2020 в 12:24
5
  • не помогло, шаблон пишет, что не может найти переменную, может дело в контроллере? прикрепила выше, вдруг сможете помочь Commented 25 апр. 2020 в 13:17
  • @Tanya что значит не помогло? у вас может быть сотня проблем в коде. вы спросили , почему 403 ошибка, а 403 приходит именно по той причине, которую я указал. сейчас в вашем сообщении об ошибке я никакой 403 ошибки не вижу, я вообще не понимаю, зачем вы лезите на столь низкий уровень при отправке запроса, когда у вас спринг под руками. RestTemplate есть, Можно что-то подключить. Я, к примеру, использую ретрофит Commented 25 апр. 2020 в 14:02
  • @Tanya ответ я изменил и добавтл код для того, чтобы вы могли его проверить и убедиться, что причина 403 именно в том, о чем я говорил. Commented 25 апр. 2020 в 14:11
  • спасибо за помощь, разобралась, помимо того, что у меня не было юзер-аджента, у меня там стояла проверка на аутентификацию глупая, спасибо за помощь еще раз! Commented 25 апр. 2020 в 18:04
  • @Tanya не за что. удачи вам Commented 25 апр. 2020 в 18:07

Ваш ответ

Черновик сохранён
Черновик удалён

Зарегистрируйтесь или войдите

Регистрация через Google
Регистрация через почту

Отправить без регистрации

Необходима, но никому не показывается

Отправить без регистрации

Необходима, но никому не показывается

Нажимая «Отправить ответ», вы соглашаетесь с условиями пользования и подтверждаете, что прочитали политику конфиденциальности.

Начните задавать вопросы и получать на них ответы

Найдите ответ на свой вопрос, задав его.

Задать вопрос

Изучите связанные вопросы

Посмотрите похожие вопросы с этими метками.