Попытка правильно доставить POST-запрос от внешнего интерфейса к серверу Java-сервлета - PullRequest
0 голосов
/ 08 октября 2019

Я создаю простое приложение crud, используя только сервлет API. Я не хочу использовать JAX-RS или Spring. Приложение имеет дело только с объектом Time Period, который имеет время начала и тип активности.

Ошибка, которую я получаю ниже

java.lang.NumberFormatException: null

Ошибка бьет по приведенному ниже коду из метода doPost.

int startTimeInt = Integer.parseInt(startTime);

Когда я закомментирую все, чтодает мне ошибку, и я пытаюсь код ниже. Это показывает как ноль.

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

Почему информация POST недоступна в запросе.

Я изучил предварительный запрос CORS, но ничего не понял.

Мой бэкэнд ниже.

package com.jeffstrunk.TimeTrackerWServlets;


import java.io.IOException;
import java.io.PrintWriter;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.google.gson.Gson;

@WebServlet("/TimePeriodController/*")
public class TimePeriodController extends HttpServlet {
    private static final long serialVersionUID = 1L;  

    private String url = "jdbc:mysql://localhost/jeffstrunkcom?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC";
    private String userName = "root";
    private String pass = "pass";

    private TimePeriodDAO timePeriodDAO = new TimePeriodDAO(url, userName, pass);

    Gson gson = new Gson();

    public TimePeriodController() {
        super();
    }

    private void sendAsJson(HttpServletResponse response, Object obj) throws IOException {
        response.setContentType("application/json");
        String res = gson.toJson(obj);     
        PrintWriter out = response.getWriter();
        out.print(res);
        out.flush();
    }

    @Override
    protected void doOptions(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        setAccessControlHeaders(resp);
        resp.setStatus(HttpServletResponse.SC_OK);
    }

    private void setAccessControlHeaders(HttpServletResponse resp) {
        resp.setHeader("Access-Control-Allow-Origin", "*");
        resp.setHeader("Access-Control-Allow-Methods", "GET, OPTIONS, HEAD, PUT, POST, DELETE");
        resp.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Authorization");
    }


    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("doGet reached");

        setAccessControlHeaders(response);
        String pathInfo = request.getPathInfo();
        String uri = request.getRequestURI();
        List<TimePeriod> timePeriods = new ArrayList();

        try {
            timePeriods = timePeriodDAO.getAllTimePeriods();
        } catch (SQLException e) {
            e.printStackTrace();
        }

        if(pathInfo == null || pathInfo.equals("/")){       
            System.out.println("path info is null");
            System.out.println("uri: " + uri);
            System.out.println("pathInfo: " + pathInfo);

            try {
                timePeriodDAO.connect();
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
            sendAsJson(response, timePeriods);
        }

        String[] splits = pathInfo.split("/");


        if(splits.length == 2){ 
            TimePeriod timePeriod = new TimePeriod();
            try {       
                String stringId = splits[1];
                int id = Integer.parseInt(stringId);
                System.out.println("Id = " + id);

                timePeriod = timePeriodDAO.getTimePeriod(id);

                sendAsJson(response, timePeriod);
            } catch (SQLException e) {
                e.printStackTrace();
            }   

        }
    }

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

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

        String pathInfo = request.getPathInfo();
        System.out.println("pathInfo: " + pathInfo);


        String startTime = request.getParameter("timePeriodId");
        int startTimeInt = Integer.parseInt(startTime);
        String activity = request.getParameter("activityType"); 
        System.out.println("startTime: " + startTime);
        System.out.println("activity: " + request.getParameter("activityType"));

        if(pathInfo == null || pathInfo.equals("/")){

            TimePeriod timePeriod = new TimePeriod();
            ActivityType activityEnum = Enum.valueOf(ActivityType.class, activity);
            timePeriod.setActivity(activityEnum);
            timePeriod.setStartTime(startTimeInt);
            try {
                timePeriodDAO.insertTimePeriod(timePeriod);
            } catch (SQLException e) {
                e.printStackTrace();
            }   
        }
            else {
                response.sendError(HttpServletResponse.SC_BAD_REQUEST);
                return;
        }
    }
}

Мой фронтэнд ниже.

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",
    };
    fetch(url, otherPram)
    .then(data=>{return data.json})
    .then(res=>console.log(res))
    .catch(error=>console.log(error))
}

HTML ниже.

<button onclick="post()">Post</button>
...