gpt4 book ai didi

java - 返回无效 GZIP 的套接字 HTTP 请求

转载 作者:塔克拉玛干 更新时间:2023-11-01 19:07:39 25 4
gpt4 key购买 nike

我正在自学更多有关 HTTP 请求等的知识,因此我使用 Java 的 HttpURLConnection 类编写了一个简单的 POST 请求,它返回易于解压缩的压缩数据。我决定进入较低级别并使用套接字发送 HTTP 请求(用于练习)。经过一系列谷歌搜索后我想通了,但有一个问题。当服务器响应压缩数据时,它是无效的。这是一些调试的图像。 http://i.imgur.com/KfAcero.png

“=”分隔线下面的部分是使用 HttpURLConnection 实例时的响应,但上面的部分是使用套接字时的响应。我不太确定这里发生了什么。底部有效,顶部无效。

HttpParameter 和 header 类仅存储键和值。

public String sendPost(String host, String path, List<HttpParameter> parameters, List<HttpHeader> headers) throws UnknownHostException, IOException {
String data = this.encodeParameters(parameters);
Socket socket = new Socket(host, 80);
PrintWriter writer = new PrintWriter(socket.getOutputStream());
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
writer.println("POST " + path + " HTTP/1.1");
for(HttpHeader header : headers) {
writer.println(header.getField() + ": " + header.getValue());
}
writer.println();
writer.println(data);
writer.flush();
StringBuilder contentBuilder = new StringBuilder();
for(String line; (line = reader.readLine()) != null;) {
contentBuilder.append(line + "\n");
}
reader.close();
writer.close();
return contentBuilder.toString();
}

最佳答案

您的问题是您正在使用 ReaderWriter 来处理非文本内容。

InputStreamOutputStream 使用字节; ReaderWriter 处理编码文本。如果您尝试将 ReaderWriter 与未编码文本的内容一起使用,您将破坏它。

使用 Writer 发送请求是可以的。

你想做这样的事情:

InputStream in = socket.getInputStream();

// ...

ByteArrayOutputStream contentBuilder = new ByteArrayOutputStream();
byte[] buffer = new byte[32768]; // the size of this doesn't matter too much
int num_read;
while(true) {
num_read = in.read(buffer);
if(num_read < 0)
break;
contentBuilder.write(buffer, 0, num_read);
}
in.close();
writer.close();
return contentBuilder.toByteArray();

并使sendPost返回一个字节数组。

关于java - 返回无效 GZIP 的套接字 HTTP 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28799528/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com