Search code examples
javascriptangularjsservletsjava-ee-6

[AngularJS][JavaEE] How to send multiple data with $http.post()


I work on a webapp, i have a probleme to send data and i didn't find some example. I use AngularJS and JavaEE.

Now :

AngularJs :

quiz is an object.

 roomFactory.create = function(quiz){
    //item.idLesson = $stateParams.lessonid;
    return $http.post("/api/private/room/create",quiz)
        .then(function (response){
            roomFactory.room = response.data;
            return roomFactory.room;
        },function (response){
            $q.reject(response);
        });
};

Servlet :

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //get the identity of the one who send the request
    Map<String, Object> payload = AppConfig.getRequestPayload(request);
    //objetMapper --> use to add request....
    ObjectMapper objectMapper = new ObjectMapper();

    Random randomGenerator;
    // Number of question for the two sets
    int nbQuestion = 0;
    List<Question> questionsRandom = new ArrayList<>();

    //Get object from request

    //List<String> list = objectMapper.readValue(AppConfig.getJsonRequest(request), new TypeReference<List<String>>(){});
    //List<Quiz> list2 = objectMapper.readValue(AppConfig.getJsonRequest(request), new TypeReference<List<Quiz>>(){});
    //String name = list.get(0);

    Quiz quiz = objectMapper.readValue(AppConfig.getJsonRequest(request),Quiz.class);
    if (quiz.getDuration() == null) {
        quiz.setDuration(-1);
    }

    //LOGGER.info("getIdLesson : ");
    //Get list of question from datastore
    List<Question> questions = ofy().load().type(Question.class).filter("idLesson", quiz.getIdLesson()).list();

    //Take some questions from the list to make the quiz
    if (!questions.isEmpty()) {
        if (questions.size() < quiz.getNbQuestion()) {
            nbQuestion = questions.size();
        } else {
            nbQuestion = quiz.getNbQuestion();
        }
        // we peek all the question randomly to the server and create a list of question
        while (nbQuestion > 0) {
            randomGenerator = new Random();
            int index = randomGenerator.nextInt(questions.size());
            questionsRandom.add(questions.get(index));
            questions.remove(questions.get(index));
            nbQuestion--;
        }

        if (!questionsRandom.isEmpty()) {

            //Set the quiz
            quiz.setQuestions(questionsRandom);
            quiz.setNbQuestion(questionsRandom.size());
            Lesson lesson = ofy().load().type(Lesson.class).id(Long.valueOf(quiz.getIdLesson())).now();
            //Lesson lesson = ofy().load().type(Lesson.class).filter("idLesson", quiz.getIdLesson()).first().now();


            //SET the room
            //User user = ofy().load().type(User.class).id(Long.valueOf(jsonUserId.toString())).now();

            User user = ofy().load().type(User.class).filter("email", payload.get("email").toString()).first().now();

            //LOGGER.info("User : "+user.getFirstName());

            Room room = new Room(user, quiz, 60);
            room.calculTimeToFinishTheQuiz();
            room.setName(lesson.getTitle() + RoomManager.roomNumber);
            room.setId(quiz.getIdLesson() + RoomManager.roomNumber);

            //Save the room in RoomManager
            RoomManager.roomNumber++;
            RoomManager.addNewRoom(quiz.getIdLesson(), room);


            //Send the room in response
            String json = objectMapper.writeValueAsString(room);
            response.setContentType("application/json");
            response.getWriter().write(json);
        }
    }
}

}

I need another parameter in my fonction create :

roomFactory.create = function(quiz, roomName){

I try this to send both data :

return $http.post("/api/private/room/create",quiz, roomName)

or

return $http.post("/api/private/room/create",[quiz, roomName])

Get data in Servlet :

first solution :

String roomName= objectMapper.readValue(AppConfig.getJsonRequest(request),String.class);

second solution :

List<String> list = objectMapper.readValue(AppConfig.getJsonRequest(request), new TypeReference<List<String>>(){});

    String roomName = list.get(0);
    roomName = roomName.replace("\"", "");

but the second didn't work because quiz is an object. I try to convert quiz but i didn't work as well.


Solution

  • You can pass multiple Data as follow

    var Indata = {'pram1': 'value1', 'pram2': 'value2' };
    $http.post("/api/private/room/create", Indata)
    .then(function (response){
            roomFactory.room = response.data;
            return roomFactory.room;
        },function (response){
            $q.reject(response);
        });
    

    Here is the better example