user2877566 user2877566 - 4 months ago 18
Javascript Question

Jquery Ajax won't return the data (parse error), but Postman succeeds

I've been using Postman to test my REST API (written in Go). Now is the moment of truth, connecting to the front end and I've hit a hiccup. I'm using jQuery.ajax to send a GET to my server, which should then send me back the response.

Note: Going to postman and sending a GET request to

http://REMOTE_IP:8000/users/
returns the information I'm looking for, an array of User objects (JSON). It confuses me that it would work for Postman, but not jQuery.

jQuery Get



$.ajax({
url: "http://REMOTE_IP:8000/users/",
type: "GET",
dataType: 'jsonp',
contentType: 'application/json',
success: function(data) {
console.log(data);
},
error: function(jqXHR, status, err) {
console.log(jqXHR);
console.log(status);
console.log(err);
}
});


Go Backend



func GetUsersRoute(w http.ResponseWriter, r *http.Request) {
var queryResult []models.User

queryErr := Config.Users.Find(bson.M{}).All(&queryResult)
resultsJSON, jsonErr := json.Marshal(queryResult)

handleQueryAndJsonErrors(w, queryErr, jsonErr)

// added these for cors, not sure they do anything helpful
w.Header().Set("Content-Type", "application/json; charset=UTF-8")
w.Header().Set("Access-Control-Request-Headers", "*")

w.WriteHeader(http.StatusOK)
w.Write(resultsJSON)
}


I also have a logger attached to my go backend, and here are the request method and request URI that are printed out when I make the request:

GET /users?callback=jQuery223019655483671137586_1461946990647&_=1461946990648


Here are some articles I found useful:

The data which jquery $.ajax function return could not be parse to json

https://github.com/codegangsta/martini-contrib/blob/master/cors/cors.go

https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Access-Control-Allow-Methods

Here are the errors returned with jQuery's err callback:
enter image description here

What could be going wrong?

Answer

# Answer

I found a nice go library that handles the cross-origin problems I was having, meaning I didn't have to rely on jsonp. Here's the revised go code:

Using the CORS Handler

handler := cors.Default().Handler(r)
err := http.ListenAndServe(port, handler)

if err != nil {
    panic(err)
}

Revised handler

func GetUsersRoute(w http.ResponseWriter, r *http.Request) {
    var queryResult []models.User

    queryErr := Config.Users.Find(bson.M{}).All(&queryResult)
    resultsJSON, jsonErr := json.Marshal(queryResult)

    handleQueryAndJsonErrors(w, queryErr, jsonErr)

    w.Header().Set("Content-Type", "application/json; charset=UTF-8")
    w.WriteHeader(http.StatusOK)
    w.Write(resultsJSON)
}

Calling from the frontend

var extension = 'users/',
    requestPath = serverAddress + extension;

$.ajax({
    url: requestPath,
    type: 'GET',
    dataType: 'json',
    contentType: 'application/json',
    success: successCall,
    error: failCall
});