每次通过错误时Ajax请求(在服务器端jersey/JavaRESTfulWS中的JSONP中没有应答?)
我有一个用Jersey(RESTfulWeb服务)制作的API,非常简单。我已经能够通过我的android应用程序进行请求/回答 现在,为了管理数据,我正在开发一个web后端。问题是,当我使用ajax调用时,每次都会通过“错误”部分给出答案 尽管看起来很奇怪,但只要看一眼firebug,调用/应答似乎是正确的,最后的200 OK应答和正确的JSON数据 javascript代码如下所示:每次通过错误时Ajax请求(在服务器端jersey/JavaRESTfulWS中的JSONP中没有应答?),java,ajax,json,jersey,jsonp,Java,Ajax,Json,Jersey,Jsonp,我有一个用Jersey(RESTfulWeb服务)制作的API,非常简单。我已经能够通过我的android应用程序进行请求/回答 现在,为了管理数据,我正在开发一个web后端。问题是,当我使用ajax调用时,每次都会通过“错误”部分给出答案 尽管看起来很奇怪,但只要看一眼firebug,调用/应答似乎是正确的,最后的200 OK应答和正确的JSON数据 javascript代码如下所示: $(document).ready(function (){ var theUrl = "
$(document).ready(function (){
var theUrl = "***url****/Rest/provincias";
jQuery.ajax({
beforeSend: function(req) {
req.setRequestHeader("Accept", "application/json");
},
cache: false,
async: false,
crossDomain: true,
type: "GET",
url: theUrl,
dataType: "jsonp",
jsonp: false,
contentType: "application/json; charset=utf-8",
statusCode: {
200: function (data){
//OK ANSWER
alert("Answer OK: " + data.response);
}
},
error: function (xhr,err) {
alert("Otra vez en error... " + xhr + "' '" + err);
},
success: function (data){
//Comprobamos en el json si tenemos true o false.
alert("éxito!! " + data);
},
complete: function (xhr, status) {
if (status === 'error' || !xhr.responseText) {
alert("errorrr");
}
else {
var data = xhr.responseText;
alert("Info en complete: " + data);
}
}
});
});
我通过浏览器进行调用时编写的JSON文本与此类似:
{
"response": true,
"data_int": 0,
"data_boolean": false,
"data_float": 0.0,
"data_double": 0.0,
"data_byte": 0,
"data_short": 0,
"data_long": 0,
"data_char": "\u0000",
"object": [
{
"id": 1,
"nombreCas": "Ãlava",
"nombreEus": "Araba",
"localizacion": {
"id": 46,
"latitude": "42.847511",
"longitude": "-2.679730"
},
"pueblos": {
"1": {
"id": 1,
"nombreCas": "AlegrÃa",
"nombreEus": "Dulantzi",
"provincia": null,
"localizacion": {
"id": 1,
"latitude": "42.841171",
"longitude": "-2.512608"
},
"barrios": {}
},
........
正如我所读到的,错误可能是因为答案不是JSONP格式(restful WS是用JSON格式文本回答的),所以不能删除行数据类型:“JSONP”。如果我删除它,答案就不正确
有什么东西可以添加到我的web服务中吗?例如,如何在此代码中添加JSONP支持:
package main.java.webService;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import main.java.model.AccessManager;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import main.java.dto.Provincia;
import main.java.dto.ReturningClass;
/**
* @author Jon_Inazio
*
*/
@Path("provincias")
public class PueblosProvinciasService {
@GET
@Produces("application/json")
public String getProvincias(){
String provincias = null;
HashMap<Integer, Provincia> provinciasList = new HashMap<Integer, Provincia>();
try{
provinciasList = new AccessManager().getProvincias();
GsonBuilder gb = new GsonBuilder().serializeNulls().setPrettyPrinting();
Gson gson = gb.create();
Collection<Provincia> arrayProvs = new ArrayList<Provincia>();
arrayProvs = provinciasList.values();
/*
* CONVERTIR HASH MAP A UNA LISTA --> JSON LO PIDE ASI
*/
//ReturningClass<HashMap<Integer, Provincia>> ret = new ReturningClass<HashMap<Integer, Provincia>>(true, provinciasList);
ReturningClass<Collection<Provincia>> ret = new ReturningClass<Collection<Provincia>>(true, arrayProvs);
System.out.println("**Se han consultado las provincias!!");
provincias = gson.toJson(ret);
}catch(Exception e){
e.printStackTrace();
}
return provincias;
}
}
包main.java.webService;
导入java.util.ArrayList;
导入java.util.Collection;
导入java.util.HashMap;
导入javax.ws.rs.GET;
导入javax.ws.rs.Path;
导入javax.ws.rs.products;
导入main.java.model.AccessManager;
导入com.google.gson.gson;
导入com.google.gson.GsonBuilder;
导入main.java.dto.Provincia;
导入main.java.dto.ReturningClass;
/**
*@作者Jon_Inazio
*
*/
@路径(“省”)
公共类PueblosProvinciasService{
@得到
@生成(“应用程序/json”)
公共字符串getProvincias(){
字符串provincias=null;
HashMap Provincialist=新HashMap();
试一试{
provinciasList=new AccessManager().getProvincias();
GsonBuilder gb=新的GsonBuilder().serializeNulls().SetPrettypPrinting();
Gson Gson=gb.create();
集合arrayProvs=newarraylist();
arrayProvs=省列表值();
/*
*CONVERTIR哈希映射UNA LISTA-->JSON LO PIDE ASI
*/
//ReturningClass ret=新的ReturningClass(正确,省级列表);
ReturningClass ret=新的ReturningClass(真,arrayProvs);
System.out.println(“**Se han consultado las provincias!!”);
provincias=gson.toJson(ret);
}捕获(例外e){
e、 printStackTrace();
}
返回省;
}
}
提前感谢,我希望每个人都能理解我:)。当我编写Jersey Web服务时,我通常会让我的方法返回响应对象。这允许我包含有关状态代码和响应头的信息。这在发出跨域请求时尤其重要(就像您正在做的那样),因为它允许您指定启用跨域请求的重要响应头“Access Control Allow Origin”
@GET
@Produces("application/json")
@Path("myPath")
public Response getAllCommissions() {
// Perform method function
String json = "OUTPUT_OF_METHOD";
// Creates a ResponseBuilder
ResponseBuilder builder = new ResponseBuilderImpl();
// Sets the header of the return data
builder.header("content-type", "application/json");
// Sets the response code as a 200
builder.status(Response.Status.OK);
// Allows Cross Domain Requests from any origin
builder.header("Access-Control-Allow-Origin", "*");
// Adds your result data to the Response
builder.entity(json);
// Creates the Response
return builder.build();
}
您的响应是
JSON
而不是jsonp,请将响应设置为jsonp。我猜您在URL中缺少回调占位符。请看例句谢谢你的建议!!我已经能够访问我的Json数据:)。我需要对我的网络服务做一些改变:我怎样才能投票给你们Musa和Jk1?