0

ローカル マシンで tomcat サーブレットを実行し、サーブレットへの投稿要求を行うアプリを使用して Android エミュレーターを実行しています。POST のコードは次のとおりです (例外などは除きます)。

        String strUrl = "http://10.0.2.2:8080/DeviceDiscoveryServer/server/devices/";
        Device device = Device.getUniqueInstance();

        urlParameters += URLEncoder.encode("user", "UTF-8") + "=" + URLEncoder.encode(device.getUser(), "UTF-8");
        urlParameters += "&" + URLEncoder.encode("port", "UTF-8") + "=" + URLEncoder.encode(new Integer(Device.PORT).toString(), "UTF-8");
        urlParameters += "&" + URLEncoder.encode("address", "UTF-8") + "=" + URLEncoder.encode(device.getAddress().getHostAddress(), "UTF-8");

        URL url = new URL(strUrl);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setDoOutput(true);
        connection.setRequestMethod("POST");

        OutputStreamWriter wr = new OutputStreamWriter(connection.getOutputStream());
        wr.write(urlParameters);
        wr.flush();
        wr.close();

このコードが実行されるたびに、サーブレットは呼び出されません。ただし、リクエストのタイプを「GET」に変更し、出力ストリームに何も書き込まないと、サーブレットが呼び出され、すべて正常に動作します。POST を正しく行っていないだけですか、それとも他のエラーがありますか?

4

2 に答える 2

1

次のコードを試してみてください。

        try
{
    String argUrl = 
        "";

    String requestXml = "";
    URL url = new URL( argUrl );
    URLConnection con = url.openConnection();
    System.out.println("STRING" + requestXml);
    // specify that we will send output and accept input
    con.setDoInput(true);
    con.setDoOutput(true);

    con.setConnectTimeout( 20000 );  // long timeout, but not infinite
    con.setReadTimeout( 20000 );

    con.setUseCaches (false);
    con.setDefaultUseCaches (false);

    // tell the web server what we are sending
    con.setRequestProperty ( "Content-Type", "text/xml" );

    OutputStreamWriter writer = new OutputStreamWriter( con.getOutputStream() );
    writer.write( requestXml );
    writer.flush();
    writer.close();

    // reading the response
    InputStreamReader reader = new InputStreamReader( con.getInputStream() );

    StringBuilder buf = new StringBuilder();
    char[] cbuf = new char[ 2048 ];
    int num;

    while ( -1 != (num=reader.read( cbuf )))
    {
        buf.append( cbuf, 0, num );
    }

    String result = buf.toString();
    System.err.println( "\nResponse from server after POST:\n" + result );
}
catch( Throwable t )
{
    t.printStackTrace( System.out );
}
于 2012-09-24T04:53:08.323 に答える
0

好奇心から、リクエストのレスポンス コードを取得しようとしました。

int responseCode = connection.getResponseCode();
System.out.println(responseCode);

これにより実際にリクエストが通過し、200 を取得しました。Tomcat のログを確認したところ、リクエストは最終的に処理されました。やっurl.openConnection()たり書いたりするOutputStreamだけでは不十分だと思います。

于 2012-09-24T03:41:50.183 に答える