2012-05-21 59 views
2

我試圖調用一個Web服務,使用post方法使用json對象。我做了它然後它不會再工作不知道是什麼問題。
這裏是我的方法ajax調用與jQuery的問題jax-rs

@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 Unsupported Media Type」我不知道如何解決這個問題。我通過了太多時間沒有結果:(
謝謝你幫助我

+1

您正在運行AJAX的域是什麼?換句話說,您用來加載此頁面的網址是什麼? – jmort253

回答

1

這是消耗文本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>[email protected]</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的跨域調用在這裏是合法的b因爲服務器正在返回以下標題,這使得跨域AJAX成爲可能!

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

詳情請參閱Mozilla Developer Center page on Access-Control-Allow-Origin

+0

Hi Aymen,如果您有一個顯着的解決方案與其他人提供的不同之處在於,回答自己的問題絕對沒問題,但是您應該展示代碼並詳細描述解決方案是什麼,以便當具有相同問題的其他用戶通過Google搜索查找此問題時,他們實際上會發現也是幫助他們解決問題的答案。 StackOverflow的目標是成爲知識庫,可以幫助其他人多年。如果您沒有與提供的答案不同的答案,那麼您應該刪除它。祝你好運! – jmort253

+0

okey生病顯示代碼:) –

+0

感謝張貼,但我不認爲你實際上使這個請求跨域,因爲你的瀏覽器會拋出安全錯誤。您提出此請求的網站是否也位於http:// localhost:9080?我可以看到這個工作的唯一方法是,如果您加載http:// localhost:9080的頁面也與您發佈到的服務器http:// localhost:9080相同。 – jmort253

2

當試圖在某些瀏覽器中發出跨域AJAX請求時,通常會看到HTTP方法更改爲OPTIONS而不是更有意義錯誤消息

我注意到你的URL中包含了協議,域和端口,它支持理論上你實際上試圖向不同的域/端口組合發送AJAX請求的原理上下文

爲了澄清,即使您的請求源自本地主機並以localhost爲目標,端口(9080)和協議(http)也必須匹配。

因此,如果您加載的頁面是「http:// localhost:8080」,並且您試圖向「http:// localhost:9080」發出AJAX請求,則請求將失敗, - 域安全錯誤,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請求。

+0

是的,我發現在發送請求之前發送OPTIONS呼叫這是正常的現在我決定使用text/xml簡單化並將其映射到帶有jaxb的對象。無論如何,感謝 –