1

サーバーからデータを取得するためにApacheCommonsHttpClientを使用しています。私の問題は、返されるXMLデータが常に最初の64kに切り捨てられることです。これが関連するオブジェクトに制限を設定する場合にすぎないことを期待していましたが、明らかにそうではありませんでした。少なくとも、そのようなメソッドに関する情報は見つかりませんでした。サーバーは別の会社に属しており、おそらく他のすべての人に問題なくデータを提供しているため、これはクライアントの問題だと思います。

何か案は?

私のコードは非常に単純です:

protected String send(Server server, String query) throws Exception {
    PostMethod post = new PostMethod(server.getUrl());
    post.setParameter("XMLString", query);
    try {
        client.executeMethod(post);
       return post.getResponseBodyAsString();
    } finally {
        post.releaseConnection();
    }
}

fyi、getResponseBodyAsString()メソッドではなくInputStreamsを使用する次のコードでも同じことが起こります。

protected String send(Server server, String query) throws Exception {
    PostMethod post = new PostMethod(server.getUrl());
    post.setParameter("XMLString", query);
    try {
        client.executeMethod(post);
        InputStream stream = post.getResponseBodyAsStream();
        BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
        String line = null;
        StringBuilder sb = new StringBuilder();
        while ( (line=reader.readLine()) != null ) {
            sb.append(line);
        }
        return sb.toString();
    } finally {
        post.releaseConnection();
    }
}

それで、どこかに制限が設定されているかどうか知っていますか?文字列が応答であるという事実は常に64kであるという事実は、存在しなければならないことを示唆しているようです。しかしここで?!

ありがとう

アラステア

4

2 に答える 2

3

正誤表: 64k の制限は誤りです。表示されないEclipseデバッガーのアーティファクトのように、切り捨ての犯人であるように見えます。

解決策: コードが次のように動作するようになりました。

PostMethod post = new PostMethod(server.getUrl());
    post.setParameter("XMLString", query);
    post.setRequestContentLength(PostMethod.CONTENT_LENGTH_AUTO);
    post.setStrictMode(true);
    try {
        client.executeMethod(post);
        return post.getResponseBodyAsString();
    } finally {
        post.releaseConnection();
    }

なぜそれが機能するのかはわかりませんが、コンテンツの長さの設定に関係していると推測します。

これとは別に、これらのメソッドは非推奨であり、レガシー システムで作業しているため、これらのメソッドのみを使用していることに注意してください。より適応性の高いシステムに取り組んでいる場合は、@HellGhost のアドバイスに従うことをお勧めします。

于 2011-06-22T21:16:41.070 に答える
2

releaseConnection()結果を返す前にメソッドが呼び出されるため、ResponseBody を文字列として保存し、文字列を返します。

さらに、開発が設定され、その HttpClient および HttpCore モジュールでライブラリ HttpComponents プロジェクトに置き換えられているため、ライブラリ HttpClient 3.x をさらに使用する必要があるかどうかを検討する必要があります。
新しい HttpClient の使用例:

HttpPost post = new HttpPost(server.getUrl());
HttpResponse response = client.executeMethod(post);
return EntityUtils.toString(response.getEntity());
于 2011-06-22T20:11:06.177 に答える