0

ajax 呼び出しから jersey Web サービスに json 文字列を送信しようとしています。関連する多くの質問や記事を見てきましたが、何も機能しませんでした。フィドラーからの呼び出しを見ると、本体にjsonが表示されますが、メソッドがヒットすると文字列が空白になります。助けてくれてありがとう。

getFile: function() {
    var urlXls = 'http://localhost:8080/KodiakWebS/Kodiak/KodiakXls/generateXls';
    //var json =  '{"xls":[{"name":"Pokemon","row":[{"data":"Lugia"},{"data":"Charzard"}]},{"name":"Types","row":[{"data":"Special"},{"data":"Fire"}]}]}';   //encodeURI();
    var json = this.get('tempJSON');
    urlXls = urlXls.replace(/\s/g, "");
    $.ajax({
        url: urlXls,
        type: "POST",
        data: json,
        contentType: 'application/json; charset=utf-8', // ;charset=utf-8',
        success: function(json, status)
            window.location.assign(json.url);
            alert("yay");
        },
        error: function(xhr, err) {
           debugger;
            alert(xhr+ " || " + err);
        }
    });
},

@POST
@Path("/generateXls")
@Consumes("application/json")
@Produces({ "application/xls" })
public Response sendWorkBook(final String json) throws Exception {
    createWorkbook(json);
    FileOutputStream sprdSht = new FileOutputStream("WorkBook.xls");
    wb.write(sprdSht);
    sprdSht.close();
    System.out.println("all done");
    StreamingOutput stream = new StreamingOutput() {
        @Override
        public void write(OutputStream outPut)
                throws IOException,
                WebApplicationException {
            try {
                wb.write(outPut);
            } catch (Exception e) {
                throw new WebApplicationException(e);
            }
        }

    };
    return Response.ok(stream).header("content-disposition", "attachment; filename = egisDoc.xls").build();
}
4

2 に答える 2

0

カプリカからの提案と少しいじくり回したおかげで、それを機能させることができました。私のコードはあまり変更されていませんが、ここにあります。

@PUT
@Path("/generateXls")
@Consumes("text/plain")
@Produces({ "application/xls" })
public Response sendWorkBook(String json) throws Exception {
    System.out.println("json: " + json);
    createWorkbook(json);

getFile: function() {
    var urlXls = 'http://localhost:8080/KodiakWebS/Kodiak/KodiakXls/generateXls';
    //var json =  '{"xls":[{"name":"Pokemon","row":[{"data":"Lugia"},{"data":"Charzard"}]},{"name":"Types","row":[{"data":"Special"},{"data":"Fire"}]}]}';   //encodeURI();
    var json = this.get('tempJSON');
    urlXls = urlXls.replace(/\s/g, "");
    $.ajax({
        type: "PUT",
        url: urlXls,
        data: json,
        contentType: 'text/plain; charset=utf-8',   // ;charset=utf-8',
        success: function(json, status) {
            window.location.href = json.url;
            //window.location.assign(json.url);
            //alert("yay");
        },
        error: function(xhr, err) {
           debugger;
            alert(xhr+ " || " + err);
        }
    });
},

次に、私のサービスが作成する xls ファイルをダウンロードしようとしています。うまくいけば、私が動作しているものを取得する方法を尋ねる必要はありません (ただし、誰かが誇りに思って共有したい方法を持っている場合は、大歓迎ですそれも)。助けてくれてありがとう。

于 2013-10-10T12:36:00.963 に答える
0

アプリケーション/json を使用する場合は、提供する JSON をモデル化する Java オブジェクトを提供する必要があると思います。

JSON を文字列としてのみ必要な場合は、text/plain を使用する必要があります。

JAXRS を使用する場合、通常は次のようになります。

@PUT
@Path("entities")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public SomeDomainObject updateSomeEntity(SomeDomainObject someDomainObject) {
    // Whatever...
}

「SomeDomainObject」は、ゲッターとセッターを備えた単なる POJO です。

私は通常、JAXB 実装ではなく、JacksonJsonProvider 実装を使用します。上記のスタイルのコントローラーは、JSON マーシャリングで問題なく動作します。ドメイン オブジェクトに JSON アノテーションを追加する必要さえありません。

于 2013-10-08T15:06:10.993 に答える