Код состояния 404 при вызове API Spring-boot, но не для почтальона или браузера - PullRequest
0 голосов
/ 28 сентября 2019

Я хочу сделать вызов API для локального сервера REST, созданного с помощью Spring-Boot, который взаимодействует с mongodb.Я уже проверил некоторые сообщения, которые нашел в этой теме, но моя проблема, кажется, немного отличается.

Вот некоторые фрагменты кода, которые имеют отношение:

protected static CoreEntity[] sendGET(CoreEntity[] resultList, String path) throws IOException {
    path = String.join("%20", path.split(" "));
    return handleResponse(resultList, getConnection(path, "Get"));
}

private static HttpURLConnection getConnection(String path, String requestMethod) throws IOException {
    URL url = new URL(REQUEST_URL + path);
    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
    connection.setDoOutput(true);
    connection.setDoInput(true);
    connection.setRequestProperty("Content-Type", "application/json");
    connection.setRequestProperty("accept", "application/json");
    connection.setConnectTimeout(50000);
    connection.setReadTimeout(50000);
    connection.setRequestMethod(requestMethod);
    initializeGSON();
    return connection;
}

private static CoreEntity[] handleResponse(CoreEntity[] resultList, HttpURLConnection connection) {
    try {
        final int status = connection.getResponseCode();
        if (status == HttpURLConnection.HTTP_OK) { // Success
            try (InputStreamReader reader = new InputStreamReader(connection.getInputStream()); BufferedReader in = new BufferedReader(reader)) {
                String inputLine;
                StringBuilder response = new StringBuilder();
                while ((inputLine = in.readLine()) != null) { response.append(inputLine); }
                reader.close();
                in.close();
                JSONArray jsonArray = getJSONAsArray(response.toString());
                resultList = (CoreEntity[]) Array.newInstance(resultList.getClass().getComponentType(), jsonArray.length());
                for (int i = 0; i < jsonArray.length(); i++)
                    resultList[i] = (CoreEntity) GSON.fromJson(jsonArray.get(i).toString(), resultList.getClass().getComponentType());
            } catch (IOException | JSONException e) { e.printStackTrace(); }
        } else {
            System.out.println("\nRequest failed with error code: " + status);
        }
        connection.disconnect();
        return resultList;
    } catch (ConnectException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return null;
}

Ответ наhttp://www.google.com или любая другая домашняя страница успешно работает с кодом состояния 200. Но как только я вызываю свой API, я получаю сообщение об ошибке с кодом состояния 404. Странно, что все работает, когда я использую Почтальон или браузер.Поэтому, когда я делаю запрос get через почтальон к следующему методу (http://localhost:8080/pets/3),, я могу увидеть распечатку и получить данные из mongodb, но не для кода выше. Для кода выше ничего не происходит на стороне сервера,нет распечатки, нет исключений, ничего.

@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public ResponseEntity<T> getById(@PathVariable final long id) {
    System.out.println("TEST ===> " + id);
    T entity = getService().getById(id);
    return entity == null ? ResponseEntity.notFound().build() : ResponseEntity.ok(entity);
}

Похоже, что мое приложение не может найти API, но я уже проверил, что URL-адрес правильный, поэтому я не понимаю ошибкукод 404.

Я также читал о видимости пакета, но моя структура выглядит следующим образом, поэтому я не думаю, что это является причиной.

Структура пакета (Донне путайте с именем Aerospike)

Я трачу слишком много времени на это сейчас, и я действительно отчаянно нуждаюсь в помощи и надеюсь, что вы можете помочь мне или, по крайней мере, указать мне на правильноенаправление.

Редактировать

Вот весь RestController:

@Controller
public abstract class CoreController<S extends CoreService<T>, T extends CoreEntity> {

    public static final String SERVER = "http://localhost", PORT = ":8080",
        CORE_API = SERVER + PORT + "/"; // controller/v2/
    public static final String ID = "id";
    private String api;

    public CoreController() { }
    public CoreController(final String api) { this.api = CORE_API + api; }

    @RequestMapping(value = "/{" + ID + "}", method = RequestMethod.GET)
    public ResponseEntity<T> getById(@PathVariable final long id) {
        System.out.println("TEST ===> " + id);
        T entity = getService().getById(id);
        return entity == null ? ResponseEntity.notFound().build() : ResponseEntity.ok(entity);
    }

    public abstract S getService();
}

@Controller
@RequestMapping(value = "pets/")
public class PetController extends CoreController<PetService, Pet> {

    @Autowired
    protected PetService service;
    public static final String API = "pets";

    public PetController() { super(API); }

    public PetService getService() { return service; }
}

Вот свидетельство того, что пружинный загрузчик прослушивает 8080, а такжепочтальон работает с портом 8080.

Печать сервера при запуске

1 Ответ

0 голосов
/ 28 сентября 2019

Я думаю, что вы пропустили косую черту ("/") в начале, и у вас есть дубликат в конце выставленного значения, поэтому он ищет домашних животных // {id} в контроллере изменился на значение = {"/ pets"} В любом случае, при запуске сервиса вы должны увидеть в логах незащищенный URI

...