gpt4 book ai didi

java - 如何向压缩的 HttpUrlConnection 写入 post 语句?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:47:14 25 4
gpt4 key购买 nike

我一直被告知您应该压缩数据以提高效率。在input size上,这个比较容易,如下图:

HttpURLConnection urlConnection=(HttpURLConnection) new URL(url).openConnection();
urlConnection.setRequestProperty("Accept-Encoding", "gzip");
InputStream instream=urlConnection.getInputStream();
Map<String, List<String>> headers = urlConnection.getHeaderFields();
List<String> contentEncodings=headers.get("Content-Encoding");
boolean hasGzipHeader=false;
if (contentEncodings!=null) {
for (String header:contentEncodings) {
if (header.equalsIgnoreCase("gzip")) {
hasGzipHeader=true;
break;
}
}
}
if (hasGzipHeader) {
instream = new GZIPInputStream(instream);
}

输出端似乎有点棘手。我已经找到了如何发送一般的 Post 语句输出,如下所示:

HttpsURLConnection conn = (HttpsURLConnection) url
.openConnection();
conn.setReadTimeout(10000);
conn.setConnectTimeout(15000);
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setRequestProperty("Accept-Encoding", "gzip");
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type",
"application/x-www-form-urlencoded");

OutputStream os = conn.getOutputStream();
os.write(getQuery(results).getBytes(Charset.forName("UTF8")));

private String getQuery(List<BasicNameValuePair> params)
throws UnsupportedEncodingException {
StringBuilder result = new StringBuilder();
boolean first = true;
for (BasicNameValuePair pair : params) {
if (first)
first = false;
else
result.append("&");

result.append(URLEncoder.encode(pair.getName(), "UTF-8"));
result.append("=");
result.append(URLEncoder.encode(pair.getValue(), "UTF-8"));
}
return result.toString();
}

但我不知道如何将输出流 gzip 压缩,如果可能的话。我不知道如何判断服务器是否会接受连接,以及如何告诉服务器数据已压缩。发送编码的数据很容易,如下所示:

ByteArrayOutputStream baos = new ByteArrayOutputStream();
GZIPOutputStream gzipStream = new GZIPOutputStream(baos);
gzipStream.write(getQuery(results).getBytes(
Charset.forName("UTF8")));
os.write(baos.toByteArray());

最佳答案

是的,对于输入(下载),HttpURLConnection 的 Android 实现会透明地执行 gunzip。但是对于输出(上传),这不是自动完成的。客户端无法知道服务器是否支持压缩。因此,您必须手动执行此操作,并且必须确保您的服务器能够理解请求。

您可以在 DavidWebb 找到示例.

gzip 有效载荷的代码:

static byte[] gzip(byte[] input) {
GZIPOutputStream gzipOS = null;
try {
ByteArrayOutputStream byteArrayOS = new ByteArrayOutputStream();
gzipOS = new GZIPOutputStream(byteArrayOS);
gzipOS.write(input);
gzipOS.flush();
gzipOS.close();
gzipOS = null;
return byteArrayOS.toByteArray();
} catch (Exception e) {
throw new WebbException(e); // <-- just a RuntimeException
} finally {
if (gzipOS != null) {
try { gzipOS.close(); } catch (Exception ignored) {}
}
}
}

并且您必须设置以下 header :

connection.setRequestProperty("Content-Encoding", "gzip");

关于java - 如何向压缩的 HttpUrlConnection 写入 post 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21996190/

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