gpt4 book ai didi

java - 为什么我从 Jakarta Commons HttpClient 收到空请求?

转载 作者:行者123 更新时间:2023-12-02 08:34:16 28 4
gpt4 key购买 nike

我的 Jakarta Commons HttpClient 有问题。 我自己写的HttpServer在得到真正的请求之前有一个请求是完全空的。这是第一个问题。 第一个问题已经解决了。这是由于不必要的URLConnection引起的! 第二个问题是,有时请求数据在http请求的第三行或第四行之后结束:

POST / HTTP/1.1
User-Agent: Jakarta Commons-HttpClient/3.1
Host: 127.0.0.1:4232

为了进行调试,我使用 Axis TCPMonitor。一切都很好,但请求空洞。

我如何处理流:

<罢工>

<罢工>
StringBuffer requestBuffer = new StringBuffer();

InputStreamReader is = new InputStreamReader(socket.getInputStream(), "UTF-8");

int byteIn = -1;
do {
byteIn = is.read();
if (byteIn > 0) {
requestBuffer.append((char) byteIn);
}
} while (byteIn != -1 && is.ready());

String requestData = requestBuffer.toString();

<罢工>

找到了一种处理流的新方法。我读取了所有 header 参数并使用“内容长度”来读取帖子数据。

InputStream is = mySocket.getInputStream();
if (is == null) {
return;
}
BufferedReader in = new BufferedReader(new InputStreamReader(is, "UTF-8"));

// Read the request line
// ...
// ...

// Parse the header
Properties header = new Properties();
if (st.hasMoreTokens()) {
String line = in.readLine();
while (line != null && line.trim().length() > 0) {
int p = line.indexOf(':');
header.put(line.substring(0, p).trim().toLowerCase(), line.substring(p + 1).trim());
line = in.readLine();
}
}

// If the method is POST, there may be parameters
// in data section, too, read it:
String postLine = "";
if (method.equalsIgnoreCase("POST")) {
long size = 0x7FFFFFFFFFFFFFFFl;
String contentLength = header.getProperty("content-length");
if (contentLength != null) {
try {
size = Integer.parseInt(contentLength);
} catch (NumberFormatException ex) {
}
}
postLine = "";
char buf[] = new char[512];
int read = in.read(buf);
while (read >= 0 && size > 0 && !postLine.endsWith("\r\n")) {
size -= read;
postLine += String.valueOf(buf, 0, read);
if (size > 0) {
read = in.read(buf);
}
}
postLine = postLine.trim();
decodeParms(postLine, parms);
}

我如何发送请求:

client.getParams().setSoTimeout(30000);

method = new PostMethod(url.getPath());
method.getParams().setContentCharset("utf-8");
method.setRequestHeader("Content-Type", "application/xml; charset=utf-8");
method.addRequestHeader("Connection", "close");
method.setFollowRedirects(false);

byte[] requestXml = getRequestXml();

method.setRequestEntity(new InputStreamRequestEntity(new ByteArrayInputStream(requestXml)));

client.executeMethod(method);

int statusCode = method.getStatusCode();

你们中有人知道如何解决这些问题吗?

亚历克斯

最佳答案

这可能与 while 循环中的第二个条件有关,当下一次读取可能阻塞时, isReady() 方法可能返回 false - 但你并不真正关心它是否阻塞,所以我们可以简单地删除(您可以在这里阅读更多信息: http://java.sun.com/j2se/1.5.0/docs/api/java/io/InputStreamReader.html#ready%28%29 )。尝试更改为:

byte[] buf = new byte[500];
while((is.read(buf))>-1){
requestBuffer.append(new String(buf).trim());
buf = new byte[500];
}

现在您应该收到整个请求。

关于java - 为什么我从 Jakarta Commons HttpClient 收到空请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2401151/

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