我正在尝试调用一个使用 post 方法使用 json 对象的 Web 服务。我做到了,然后它不会再工作了不知道是什么问题。
这是我的方法
@POST
@Path("/post")
@Consumes("application/json")
@Produces("application/json")
public Response testClient(Client c) throws IOException {
System.out.println(c.getAdresseCl());
ResponseBuilder builder = Response.ok(c.getAdresseCl());
builder.header("Access-Control-Allow-Origin", "*");
builder.header("Access-Control-Max-Age", "3600");
builder.header("Access-Control-Allow-Methods", "*");
builder.header(
"Access-Control-Allow-Headers",
"X-Requested-With,Host,User-Agent,Accept,Accept-Language,Accept-Encoding,Accept-Charset,Keep-Alive,Connection,Referer,Origin");
return builder.build();
}
叫这个我用了这个
$.ajax({
type: 'POST',
url: "http://localhost:9080/FournisseurWeb/jaxrs/clients/post",
data: '{"adresseCl":"tunis"}',
dataType:'json',
contentType: "application/json; charset=utf-8",
success: function (msg) {
alert(msg);
},
error: function (xhr, ajaxOptions, thrownError) {
alert('error');
}
});
好吧,我说当我将 contentType 设置为 application/json 时,该方法将更改为 选项 .当我不使用内容类型时,我得到了"415 不支持的媒体类型",我不知道如何解决这个问题。我花了太多时间没有结果:(
谢谢你帮助我
尝试在某些浏览器中发出跨域 AJAX 请求时,通常会看到 HTTP 方法更改为 OPTIONS,而不是更有意义的错误消息。
我注意到在您的 URL 中您包含协议、域和端口,这支持您实际上尝试向与原始上下文不同的域/端口组合发出 AJAX 请求的理论。
澄清一下,即使您的请求来自本地主机并面向本地主机,端口 (9080( 和协议 (http( 也必须匹配。
因此,如果您加载的页面是"http://localhost:8080",并且您尝试向"http://localhost:9080"发出 AJAX 请求,则该请求将失败,可能会引发同一域安全错误、415 不支持的媒体类型和/或将 HTTP 方法更改为 OPTIONS。
确保避免此错误的一种方法是在发出 AJAX 请求时仅使用完整路径或相对路径,例如:
url: "/FournisseurWeb/jaxrs/clients/post",
这会迫使您始终向同一域发出请求。
跨域请求
如果您确实需要能够发出跨域请求,这是可能的,但只能通过两种方法。
首先,您可以使用代理,在该代理中,您可以向域发出 HTTP 请求,然后将请求转发到另一台服务器。服务器在相互发送和接收数据时无需关注同一域策略。
其次,您可以使用 JSONP(也称为脚本标记远程处理(,它涉及利用 <script>
元素在不同域之间发送请求的能力。
// added callback= query parameter to convert this to JSONP
$.ajax({
type: 'POST',
url: "http://localhost:9080/FournisseurWeb/jaxrs/clients/post?callback=",
data: '{"adresseCl":"tunis"}',
dataType:'json',
contentType: "application/json; charset=utf-8",
success: function (msg) {
alert(msg);
},
error: function (xhr, ajaxOptions, thrownError) {
alert('error');
}
});
注意:使用 JSONP 时,您的服务器必须使用包含在由回调参数标识的函数调用中的 JSON 进行响应。有关更深入的详细信息,请参阅 jQuery 文档。
除此之外,您必须向加载页面的同一域发出 AJAX 请求。
这是使用文本 XML fomat 并将其映射到对象以持久
化它的方法@POST
@Path("/inscription")
@Produces(MediaType.TEXT_HTML)
public Response testClient(String s) {
ResponseBuilder builder = null;
try {
final String xmlString = s;
final StringReader xmlReader = new StringReader(xmlString);
final StreamSource xmlSource = new StreamSource(xmlReader);
final JAXBContext jaxbContext = JAXBContext
.newInstance(Client.class);
final Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
final Client client = (Client) unmarshaller.unmarshal(xmlSource,
Client.class).getValue();
System.out.println("nomCl : " + client.getNomCl());
System.out.println("prenomCl : " + client.getPrenomCl());
System.out.println("emailCl : " + client.getEmailCl());
System.out.println("numTel : " + client.getNumTel());
System.out.println("long_ : " + client.getLong_());
System.out.println("lat : " + client.getLat());
System.out.println("LoginCl : " + client.getLoginCl());
System.out.println("PasswordCl : " + client.getPasswordCl());
System.out.println("adresseCl : " + client.getAdresseCl());
EntityManagerFactory factory;
factory = Persistence.createEntityManagerFactory("FournisseurWeb");
EntityManager em = factory.createEntityManager();
em.getTransaction().begin();
em.persist(client);
em.getTransaction().commit();
em.close();
factory.close();
builder = Response.ok("true");
} catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
builder = Response.ok("false");
builder.header("Access-Control-Allow-Origin", "*");
builder.header("Access-Control-Max-Age", "3600");
builder.header("Access-Control-Allow-Methods", "POST");
builder.header(
"Access-Control-Allow-Headers",
"X-Requested-With,Host,User-Agent,Accept,Accept-Language,Accept-Encoding,Accept-Charset,Keep-Alive,Connection,Referer,Origin");
return builder.build();
}
builder.header("Access-Control-Allow-Origin", "*");
builder.header("Access-Control-Max-Age", "3600");
builder.header("Access-Control-Allow-Methods", "POST");
builder.header(
"Access-Control-Allow-Headers",
"X-Requested-With,Host,User-Agent,Accept,Accept-Language,Accept-Encoding,Accept-Charset,Keep-Alive,Connection,Referer,Origin");
return builder.build();
}
我曾经在此示例中使用 ajax 调用此方法:
var x="<client><nomCl>Taarit</nomCl><prenomCl>Aymen</prenomCl><emailCl>aymen.taarit@gmail.com</emailCl><numTel>222</numTel><long_>1.66</long_></client>";
$.ajax({
url: 'http://localhost:9080/FournisseurWeb/jaxrs/clients/cl',
type: 'post',
scriptCharset: "utf-8" ,
dataType:"xml",
data: x,
success: function(data, status) {
console.log(data);
}
});
这是使用跨域使用 ajax POST 的 jax-rs 调用,因此希望它对:)有所帮助
注意:没有 JSONP 的跨域调用在这里是合法的,因为服务器返回以下标头,这将启用跨域 AJAX!
builder.header("Access-Control-Allow-Origin", "*");
有关更多详细信息,请参阅 Mozilla 开发人员中心页面的 Access-Control-Allow-Origin。