Ajax调用JAX-RS与jquery问题(ajax call to jax-rs with jqu

2019-09-17 09:25发布

我想打电话给消耗与POST方法。我这样做是那么它不会再工作不知道是什么问题JSON对象的WebService。
这里是我的方法

@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不支持的媒体类型”我不知道如何解决这个问题。 我经过了太多的时间没有结果:(
感谢你们对我的帮助

Answer 1:

当试图使在某些浏览器跨域AJAX请求,这是一个经常可以看到以代替更有意义的错误消息的HTTP方法更改选项。

我注意到在您的网址,你包括协议,域和端口,它支持的理论,你实际上是试图使一个AJAX请求,比起始上下文不同的域/端口组合。

为了澄清,即使你的请求从本地主机和定位源自本地主机,端口(9080)和协议(HTTP)也必须匹配。

因此,如果您加载的页面为“http://本地主机:8080”和你试图让一个Ajax请求的“http://本地主机:9080”,请求将失败,可能会引发同域安全性错误,415不支持的媒体类型,和/或改变HTTP方法选项。

一种方法,以确保你避免这个错误是,让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请求的页面从加载同一个域。



Answer 2:

这是消耗文本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);         
        }
    });

这是一个JAX-RS使用跨域使用Ajax POST调用所以希望它有助于:)

注:不带JSONP跨域调用是合法的,因为这里的服务器返回下面的头,这使得跨域AJAX!

 builder.header("Access-Control-Allow-Origin", "*");

见在访问控制允许来源Mozilla开发者中心页面了解更多详情。



文章来源: ajax call to jax-rs with jquery issue