问题
I've been googleing a bit around internet looking for a (correctly) way to @Consume an "application/json" file in a web resource on my server.
I'm using glassfish app server, so it's a java resource.
here is the calling javascvript code:
var url="/MBC/pages/lives/";
var mygetrequest=new ajaxRequest();
mygetrequest.onreadystatechange=function(){
if (mygetrequest.readyState==4){
if (mygetrequest.status==200 || window.location.href.indexOf("http")==-1){
var render="";
var JsonIn =JSON.parse(mygetrequest.responseText);
if(JsonIn.error==undefined){
render="generic error";
}
}else
render=mygetrequest.responseText ;
document.getElementById(div).innerHTML=render;
}else{
render="An error has occured making the request";
}
};
var json2Send = "{" +
"boss:\""+location.href.substring(location.href.length-5,location.href.length-4)+"\"," ;
if(document.newLive.bval.value=='')
json2Send+="bands:[],";
else
json2Send+="bands:["+document.newLive.bval.value+"],";
json2Send+="data:\""+document.newLive.dateEvent.value+"\"," +
"address:{street:\""+document.newLive.street.value+"\"," +
"number:\""+document.newLive.number.value+"\"," +
"city:\""+document.newLive.city.value+"\"," +
"region:\""+document.newLive.region.value+"\"," +
"state:\""+document.newLive.state.value+"\"}" +
"}";
mygetrequest.open("POST", url, true);
mygetrequest.setRequestHeader("Content-type", "application/json");
mygetrequest.send(json2Send);
where json2Send is the json String the client has to send to the server.
here is instead the server side code:
@POST
@Path("configLiveBand")
@Consumes("application/json")
@Produces("application/json")
public String liveBandInsert(String jsonIn, @Context HttpServletRequest request) throws ParseException{
I'm now asking to you what do I have to do in order to let the server read the input json string coming from the javascript. Obviously, the way I described above doesn't work. the server returns
HTTP Status 405 -
type Status report
message
descriptionThe specified HTTP method is not allowed for the requested resource ().
looking my problem over the internet, I've found solutions involving "readline()" method of the "BufferedReader" class. I do not like this solution. I prefer, if ther is a way, to inject the json file instead to read line by line the input string.
any help is well accepted thanks
回答1:
Glad I could help.
I still recommend constructing your json2Send
using actual Javascript Object Notation (JSON) instead of string concatenation, e.g. like this:
// This creates an "empty" JS object, with no properties.
var json2Send = new Object();
var length = location.href.length;
// Adding a property is as easy as just setting it, it will be created by this.
json2Send.boss = location.href.substring(length - 5, length - 4);
if (document.newLive.bval.value == '') {
json2Send.bands = [];
} else {
json2Send.bands = [document.newLive.bval.value];
}
json2Send.data = document.newLive.dateEvent.value;
// Properties can also be other objects, here created with the
// object literal notation of { key:value, ...}.
json2Send.address = {
// Inside, it's just another JS object again,
// this time setting properties with literal notation key:value
// Note how there's no need to quote anything here!
street: document.newLive.street.value,
number: document.newLive.number.value,
city: document.newLive.city.value,
region: document.newLive.region.value,
state: document.newLive.state.value
};
and then converting it to a string for the HTTP POST like this:
mygetrequest.open("POST", url, true);
mygetrequest.setRequestHeader("Content-type", "application/json");
mygetrequest.send(JSON.stringify(json2Send));
This will catch syntax errors much earlier, relieves you from manually quoting all the different bits and pieces, is most likely faster and it sure makes the whole thing a lot more robust.
回答2:
the problem was the json as Philipp wrote:
json2Send+="\"data\":\""+document.newLive.dateEvent.value+"\"," +
"\"address\":{\"street\":\""+document.newLive.street.value+"\"," +
"\"number\":\""+document.newLive.number.value+"\"," +
"\"city\":\""+document.newLive.city.value+"\"," +
"\"region\":\""+document.newLive.region.value+"\"," +
"\"state\":\""+document.newLive.state.value+"\"}" +
"}";
instead of
json2Send+="data:\""+document.newLive.dateEvent.value+"\"," +
"address:{street:\""+document.newLive.street.value+"\"," +
"number:\""+document.newLive.number.value+"\"," +
"city:\""+document.newLive.city.value+"\"," +
"region:\""+document.newLive.region.value+"\"," +
"state:\""+document.newLive.state.value+"\"}" +
"}";
now I can read, post and send the json result back to the client. ;-) thanks Philipp
来源:https://stackoverflow.com/questions/11185681/post-json-to-java-server