java - 获取将从 HttpPost 发送的完整的原始 HTTP 请求消息

标签 java apache http post

我正在尝试构建原始 HTTP POST 请求。但是,我不想实际连接到服务器并发送消息。

我一直在研究 Apache HTTP 库,希望我可以创建一个 HttpPost 对象,设置实体,然后获取它创建的消息。到目前为止,我可以转储实体,但不能转储出现在服务器端的整个请求。

有什么想法吗?当然,除了重新创建轮子。

解决方案

我将 ShyJ 的响应重构为一对静态类,但原始响应运行良好。这是两个类:

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;
}

最佳答案

这可以通过 http-client 实现并伪造一些方法。我使用了 3.1 版本的 http-client

示例

这段代码:

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;

import org.apache.commons.httpclient.HttpConnection;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpState;
import org.apache.commons.httpclient.StatusLine;
import org.apache.commons.httpclient.methods.PostMethod;

public class Main {
    public static void main(String[] args) throws Exception {
        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
        PostMethod method = new PostMethod () {
            @Override
            protected void readResponse(HttpState state, HttpConnection conn)
                    throws IOException, HttpException {
                statusLine = new StatusLine ("HTTP/1.1 200 OK");
            }
        };
        method.addParameter("aa", "b");

        method.execute(new HttpState (), new HttpConnection("http://www.google.abc/hi", 80) {

            @Override
            public void flushRequestOutputStream() throws IOException {
            }

            @Override
            public OutputStream getRequestOutputStream() throws IOException,
                    IllegalStateException {
                return baos;
            }

            @Override
            public void write(byte[] data) throws IOException,
                    IllegalStateException {
                baos.write(data);
            }

        });

        final String postBody = new String (baos.toByteArray());

        System.out.println(postBody);
    }
}

会回来

POST / HTTP/1.1
User-Agent: Jakarta Commons-HttpClient/3.1
Host: http://www.google.abc/hi
Content-Length: 4
Content-Type: application/x-www-form-urlencoded

aa=b

关于java - 获取将从 HttpPost 发送的完整的原始 HTTP 请求消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13502198/

相关文章:

java - Collections.unmodifiableList 是否存在性能风险?

java - JSch SFTP 放入 IBM z/OS 失败 :failed to write file; nested exception is 3: Permission denied

php - 将 php 文件从 eclipse 发布到 apache htdocs

Java Http 服务器。 HttpHandler 被调用两次

rest - Invoke-RestMethod 的错误处理 - Powershell

http - 在 Go 中检测断开连接的正确方法是什么?

java - 如何打印负整数的所有设置位

java - MQ系列9中的MQ初始上下文类

php - 3XX 重定向的自定义错误文档

apache - 烦人的 Silex 子目录 .htaccess 问题