user2308321
user2308321

Reputation: 35

send json string to server via post method

I tried many examples I found here but none worked for me, I get error or a null object on the server side. This is on client side:

jsonManual = JSON.stringify(x);
alert('send data over: ' + jsonManual); //jasonManual is a valid json string, tested
$.ajax({
    type: "POST",
    url: "loccol", //loccol.java
    data: {jsonManual:jsonManual}, 
    dataType: "json",
    contentType: "application/json",
    success: function(data, textStatus, jqXHR){
        alert(data);
    },
    error: function(jqXHR, textStatus, errorThrown){
        alert("FAIL "+errorThrown);
    }
});

server side:

public class loccol extends HttpServlet {
private static final Logger log = LoggerFactory.getLogger(loccol.class);

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    response.setContentType("application/json;charset=UTF-8");
    PrintWriter out = null;

    try {
        List<LocationData> manual = new ArrayList<LocationData>();

        String jsonManual = request.getParameter("jsonManual");


        log.error("JsonManual inside servlet: " + jsonManual);

            ObjectMapper m = new ObjectMapper();
            JsonNode rootNode = m.readTree(jsonManual);  

            Iterator<JsonNode> sampleIt = rootNode.getElements();
            GeometryFactory gf = new GeometryFactory(new PrecisionModel(), 900913);
            while (sampleIt.hasNext()) {
                log.info("Starting next sample");
                JsonNode sample = sampleIt.next();
                LocationData ld = new LocationData();//Create new object
                if (sample.get("lon") != null && sample.get("lon").isDouble() &&
                           sample.get("lat") != null && sample.get("lat").isDouble()) {//We check if sample has lon and lat value
                    Coordinate c = new Coordinate(sample.get("lon").asDouble(), sample.get("lat").asDouble());
                    ld.setPoint(gf.createPoint(c));
                }
                if (sample.get("time") != null && sample.get("time").isLong()) {
                    ld.setTime(new Date(sample.get("time").asLong()));//Gets a string value
                }
                if (sample.get("floor") != null && sample.get("floor").isDouble()) {//We check if sample has lon-value
                    ld.setFloor(sample.get("floor").asDouble());//Gets a string value
                }
                if (sample.get("accuracy") != null && sample.get("accuracy").isDouble()) {//We check if sample has lon-value
                    ld.setAccuracy(sample.get("accuracy").asDouble());
                }
                if (sample.get("type") != null) {//We check if sample has lon-value
                    ld.setType(sample.get("type").asText());//Gets a string value
                }
                if (sample.get("speed") != null) {
                    ld.setSpeed(sample.get("speed").asDouble());
                }
                if (sample.get("direction") != null) {
                    ld.setSpeed(sample.get("direction").asDouble());
                }
                if (sample.get("SomethingThatDoesntExist") != null)  {
                    log.error("This example shows that you can safely check what values a sample has");
                }
                //manual.add(ld); log.info("manual add");
                manual.add(ld); 
                log.info("manual add");

            }
        for (int i = 0; i < manual.size(); i++) {
            log.info("type in manual sample "+i+": "+manual.get(i).getType());
        }
        int experimentId = SensorTracking.persistSamples(manual, null);
        out = response.getWriter();
        out.println("{\"experimentId\":"+experimentId+"}");

    } catch (Exception e) {
        e.printStackTrace();
        response.setStatus(500);            
    } finally {
        if (out != null) {
            out.close();
        }
    }
}


@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    processRequest(request, response);
}


@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    processRequest(request, response);
}

@Override
public String getServletInfo() {
    return "Short description";
}// </editor-fold>

}

Upvotes: 1

Views: 2942

Answers (1)

BalusC
BalusC

Reputation: 1108682

Your mistake is here:

contentType: "application/json",

This is wrong. When you intend to use request.getParameter() and friends in the servlet, then it expects a content type of application/x-www-form-urlencoded, which happens to be the default content type of HTML <form> and jQuery $.ajax().

Just get rid of that wrong content type instruction.

Upvotes: 3

Related Questions