Пытаюсь получить с этого сайта ответ 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]
1 ответ 1
Все потому, что вы не установили юзер агента. Добавьте эту строку и все заработает
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
Дмитрий
10.3k2 золотых знака13 серебряных знаков26 бронзовых знаков
-
не помогло, шаблон пишет, что не может найти переменную, может дело в контроллере? прикрепила выше, вдруг сможете помочьTanya– Tanya2020年04月25日 13:17:30 +00:00Commented 25 апр. 2020 в 13:17
-
@Tanya что значит не помогло? у вас может быть сотня проблем в коде. вы спросили , почему 403 ошибка, а 403 приходит именно по той причине, которую я указал. сейчас в вашем сообщении об ошибке я никакой 403 ошибки не вижу, я вообще не понимаю, зачем вы лезите на столь низкий уровень при отправке запроса, когда у вас спринг под руками. RestTemplate есть, Можно что-то подключить. Я, к примеру, использую ретрофитДмитрий– Дмитрий2020年04月25日 14:02:31 +00:00Commented 25 апр. 2020 в 14:02
-
@Tanya ответ я изменил и добавтл код для того, чтобы вы могли его проверить и убедиться, что причина 403 именно в том, о чем я говорил.Дмитрий– Дмитрий2020年04月25日 14:11:59 +00:00Commented 25 апр. 2020 в 14:11
-
спасибо за помощь, разобралась, помимо того, что у меня не было юзер-аджента, у меня там стояла проверка на аутентификацию глупая, спасибо за помощь еще раз!Tanya– Tanya2020年04月25日 18:04:12 +00:00Commented 25 апр. 2020 в 18:04
-
@Tanya не за что. удачи вамДмитрий– Дмитрий2020年04月25日 18:07:36 +00:00Commented 25 апр. 2020 в 18:07
Начните задавать вопросы и получать на них ответы
Найдите ответ на свой вопрос, задав его.
Задать вопросlang-java