2

我正在尝试调用一个使用 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 时,方法更改为 OPTIONS 。当我不使用内容类型时,我得到“415 Unsupported Media Type”,我不知道如何解决这个问题。我花了太多时间没有结果:(
谢谢你帮助我

4

2 回答 2

2

当尝试在某些浏览器中发出跨域 AJAX 请求时,通常会看到 HTTP 方法更改为 OPTIONS 而不是更有意义的错误消息。

我在您的 URL 中注意到您包含协议、域和端口,这支持您实际上尝试向与原始上下文不同的域/端口组合发出 AJAX 请求的理论。

澄清一下,即使您的请求来自 localhost 并以 localhost 为目标,端口 (9080) 和协议 (http) 也必须匹配。

因此,如果您加载的页面是“http://localhost:8080”并且您尝试向“http://localhost:9080”发出 AJAX 请求,则请求将失败,可能会引发同域安全错误, 415 Unsupported Media Type, 和/或将 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 请求。

于 2012-05-21T03:17:59.563 回答
1

这是使用文本 xml 格式并将其映射到对象以将其持久化的方法

@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", "*");

有关更多详细信息,请参阅Access-Control-Allow-Origin 上的 Mozilla 开发人员中心页面

于 2012-05-26T00:54:34.703 回答