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.
$.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);
}
});
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:
What could be going wrong?
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:
handler := cors.Default().Handler(r)
err := http.ListenAndServe(port, handler)
if err != nil {
panic(err)
}
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)
}
var extension = 'users/',
requestPath = serverAddress + extension;
$.ajax({
url: requestPath,
type: 'GET',
dataType: 'json',
contentType: 'application/json',
success: successCall,
error: failCall
});
First check whether your server can handle JSONP requests by using following tests.
http://REMOTE_IP:8000/users?callback=myFunction
The response instead of this (it will look like this if it doesn't support JSONP):
{ "thing": "value" .... }
Should look like this (again, if it supports JSONP):
myFunction({ "thing": "value" .... });