4

私はAndroidとBioJavaを使用してNCBIblastWebサイトにクエリを実行しようとしています。AndroidエミュレーターでEclipseを使用しています。コードをAndroidアプリとして実行すると、次のエラーが発生します。

W/System.err(533): java.io.IOException: An error occured submiting sequence to BLAST server. Cause: content-length promised 2000 bytes, but received 214

まったく同じコードを取得して通常のJavaアプリとして実行すると、完全に機能します。それが何であるかについてのアイデアはありますか?

4

1 に答える 1

14

また、AndroidでPOSTリクエストを作成しようとしたときにも発生しました。ヘッダーにContent-Lengthを設定し、実際のコンテンツの長さが異なる場合、AndroidでスローIOExceptionされます(プレーンJDKでは機能しましたが、間違っています)

次のコードを使用して、例外を再現できます。

try {
    URL oracle = new URL("http://oasth.gr/tools/lineTimes.php");
    HttpURLConnection yc = (HttpURLConnection) oracle.openConnection();

    yc.setRequestProperty("User-Agent",
            "Mozilla/5.0 (X11; Linux i686; rv:2.0b12) Gecko/20110222 Firefox/4.0b12");
    yc.setRequestProperty("Referer",
            "http://oasth.gr/tools/lineTimes.php");
    yc.setRequestProperty("Accept-Language",
            "el-gr,el;q=0.8,en-us;q=0.5,en;q=0.3");
    yc.setRequestProperty("Accept-Charset",
            "ISO-8859-7,utf-8;q=0.7,*;q=0.7");

    // content length should be 29 !!
    yc.setRequestProperty("Content-Length", "1000");

    // content length is 29 !
    String parames = "bline=63&goes=a&lineStops=886";

    yc.setDoOutput(true);

    OutputStreamWriter wr = new OutputStreamWriter(yc.getOutputStream());

    wr.write(parames);
    wr.flush();
    Log.d(TAG, "" + yc.getResponseCode());

    BufferedReader in = new BufferedReader(new InputStreamReader(
            yc.getInputStream()));
    String inputLine;

    StringBuilder sbu = new StringBuilder();

    while ((inputLine = in.readLine()) != null)
        sbu.append(inputLine);

    wr.close();
    in.close();

} catch (IOException e) {
    e.printStackTrace();
    Log.e("getLinesArrival Exception", e.getMessage());
}

したがって、行を削除すると

yc.setRequestProperty("Content-Length", "1000");

それが動作します!

于 2012-05-23T06:52:28.280 に答える