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 UnsupportedMediaType」が表示されます。これを修正する方法がわかりません。結果なしで時間が過ぎました:(
助けてくれてありがとう

4

2 に答える 2

2

特定のブラウザでクロスドメインAJAXリクエストを作成しようとすると、より意味のあるエラーメッセージの代わりに、HTTPメソッドがOPTIONSに変更されるのが一般的です。

あなたのURLに、プロトコル、ドメイン、ポートが含まれていることに気づきました。これは、元のコンテキストとは異なるドメイン/ポートの組み合わせに対して実際にAJAXリクエストを行おうとしているという理論をサポートしています。

明確にするために、リクエストがローカルホストから発信され、ローカルホストをターゲットにしている場合でも、ポート(9080)とプロトコル(http)も一致している必要があります。

したがって、ロードしたページが「http:// localhost:8080」であり、「http:// localhost:9080」に対してAJAXリクエストを行おうとすると、リクエストは失敗し、同じドメインのセキュリティエラーがスローされる可能性があります。 、415サポートされていないメディアタイプ、および/またはHTTPメソッドをOPTIONSに変更します。

この間違いを確実に回避する1つの方法は、次のようなAJAXリクエストを行うときにフルパスまたは相対パスのみを使用することです。

url: "/FournisseurWeb/jaxrs/clients/post",

これにより、常に同じドメインにリクエストを送信する必要があります。

クロスドメインリクエスト

クロスドメインリクエストを行う機能が実際に必要な場合、これは可能ですが、2つの方法でのみ可能です。

まず、プロキシを使用して、ドメインに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 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", "*");

詳細については、Access-Control-Allow-OriginのMozillaDeveloperCenterページを参照してください。

于 2012-05-26T00:54:34.703 に答える