Почему только GET-запрос работает на веб-интерфейсе. POST, PUT и Delete не будут работать - PullRequest
0 голосов
/ 09 октября 2019

У меня есть приложение CRUD Java-сервлет. GET, POST, PUT и DELETE работают, когда я использую почтальона. Но когда я использую свой код javascript внешнего интерфейса, будет работать только запрос GET. Методы POST, PUT и DELETE на бэкэнде сервлета достигаются, но, кажется, что параметры не прикреплены к запросу, когда он достигает бэкенда.

Ниже приведен мой код GET JS.

function getTimePeriods(){
    clearElements()
    const url = 'http://localhost:8080/TimeTrackerWServlets/TimePeriodController/'

    fetch(url)
        .then(response => response.json())
        .then(response => showTimePeriods(response))     
}  

Ниже приведен код POST JS.

function post(){
    console.log("post file reached")
    const url = 'http://localhost:8080/TimeTrackerWServlets/TimePeriodController/'
    const Data = {
        timePeriodId: "999",
        activityType: "ANIME"
    };

    const otherPram = {
        headers: {
            "content-type" : "application/json; charset=UTF - 8"
        },
        body : Data,   //JSON.stringify(Data)
        method: "POST",
        // mode: "no-cors",
    };

    fetch(url, otherPram)
    .then(data=>{return data.json})
    .then(res=>console.log(res))
    .catch(error=>console.log(error))
}

Я могу console.log к объекту, к которому я хочу присоединитьштраф в порядке запроса.

Ниже приведена сокращенная версия метода doPost моего сервлета.

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        System.out.println("doPost reached POST POST POST POST POST POST POST POST ");
        setAccessControlHeaders(response);

        System.out.println("startTime: " + request.getParameter("timePeriodId"));
        System.out.println("startTime: " + request.getParameter("activityType"));
    }

Оба

System.out.println("startTime: " + request.getParameter("timePeriodId")); ---> null
System.out.println("startTime: " + request.getParameter("activityType")); ---> null

распечатать ноль. Итак, как мне прикрепить данные к запросу на интерфейс? Твоя единственная надежда, Оби-Ван Кеноби.

Ответы [ 2 ]

0 голосов
/ 09 октября 2019

Удаление charset из заголовка content-type и повторная замена JSON stringify исправляет его.

function post(){
    console.log("post file reached")
    const url = 'http://localhost:8080/api/test123'
    const Data = {
        timePeriodId: "999",
        activityType: "ANIME"
    };
    const otherPram = {
        headers: {
            "content-type" : "application/json"
        },
        body : JSON.stringify(Data),
        method: "POST",
        // mode: "no-cors",
    };
    fetch(url, otherPram)
        .then(data=>{return data.json})
        .then(res=>console.log(res))
        .catch(error=>console.log(error))
}
0 голосов
/ 09 октября 2019

Может возникнуть проблема с использованием JSON.stringify для вашего объекта данных, а также с передачей неправильных параметров в заголовке типа контента,

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

Попробуйте использовать следующие настройки:

function post(){
    console.log("post file reached")
    const url = 'http://localhost:8080/TimeTrackerWServlets/TimePeriodController/'

    const otherPram = {
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded',
            'Accept':'application/json; charset=utf-8'
        },
        body : "timePeriodId=999&activityType=ANIME",
        method: "POST",
    };

    fetch(url, otherPram)
    .then(data=>{return data.json})
    .then(res=>console.log(res))
    .catch(error=>console.log(error))
}
...