生のHTTPPOSTリクエストを作成しようとしています。ただし、実際にサーバーに接続してメッセージを送信したくありません。
私は、HttpPostオブジェクトを作成し、エンティティを設定して、作成されたはずのメッセージを取得できることを期待して、ApacheHTTPライブラリを調べてきました。これまでのところ、エンティティをダンプすることはできますが、サーバー側に表示されるリクエスト全体をダンプすることはできません。
何か案は?もちろん、ホイールを作り直すだけではありません。
解決
ShyJの応答を静的クラスのペアにリファクタリングしましたが、元の応答は問題なく機能します。2つのクラスは次のとおりです。
public static final class LoopbackPostMethod extends PostMethod {
private static final String STATUS_LINE = "HTTP/1.1 200 OK";
@Override
protected void readResponse(HttpState state, HttpConnection conn) throws IOException, HttpException {
statusLine = new StatusLine (STATUS_LINE);
}
}
public static final class LoopbackHttpConnection extends HttpConnection {
private static final String HOST = "127.0.0.1";
private static final int PORT = 80;
private final OutputStream fOutputStream;
public LoopbackHttpConnection(OutputStream outputStream) {
super(HOST, PORT);
fOutputStream = outputStream;
}
@Override
public void flushRequestOutputStream() throws IOException { /* do nothing */ }
@Override
public OutputStream getRequestOutputStream() throws IOException, IllegalStateException {
return fOutputStream;
}
@Override
public void write(byte[] data) throws IOException, IllegalStateException {
fOutputStream.write(data);
}
}
例として、私が自分の実装に使用しているファクトリメソッドを次に示します。
private ByteBuffer createHttpRequest(ByteBuffer data) throws HttpException, IOException {
LoopbackPostMethod postMethod = new LoopbackPostMethod();
final ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
postMethod.setRequestEntity(new ByteArrayRequestEntity(data.array()));
postMethod.execute(new HttpState(), new LoopbackHttpConnection(outputStream));
byte[] bytes = outputStream.toByteArray();
ByteBuffer buffer = ByteBuffer.allocate(bytes.length);
buffer.put(bytes);
return buffer;
}