Java 套接字http请求到tomcat,但响应302
当我使用Postman使用url:localhost:8080/examples获得结果时,我可以得到正确的结果: ApacheTomcat示例 ApacheTomcat示例 tomcat版本:8.5.32 但当我使用套接字从tomcat服务器获取结果时,结果让我感到困惑。代码如下:Java 套接字http请求到tomcat,但响应302,java,sockets,tomcat,Java,Sockets,Tomcat,当我使用Postman使用url:localhost:8080/examples获得结果时,我可以得到正确的结果: ApacheTomcat示例 ApacheTomcat示例 tomcat版本:8.5.32 但当我使用套接字从tomcat服务器获取结果时,结果让我感到困惑。代码如下: public void httpTest(){ Socket socket = new Socket("localhost", 8080); data = "GET /exam
public void httpTest(){
Socket socket = new Socket("localhost", 8080);
data = "GET /examples HTTP/1.1\n" +
"Host: localhost:8080\n" +
"Cache-Control: no-cache\n" +
"Postman-Token: 60236fcd-995c-49d9-896c-f88a1bdfbfd3\n\n".getBytes();
log.debug("receive http request :\r\n{}", new String(data));
try {
//向服务器端发送数据
DataOutputStream out = new DataOutputStream(socket.getOutputStream());
out.write(data);
out.flush();
//读取服务器端数据
DataInputStream input = new DataInputStream(socket.getInputStream());
byte[] result = readStream(input);
log.debug("receive response :\r\n{}", new String(result));
input.close();
out.close();
return result;
} catch (Exception e) {
log.error("请求本地服务数据异常, ", e);
if (socket != null) {
try {
socket.close();
} catch (IOException e2) {
socket = null;
log.error("客户端关闭socket异常, " ,e);
}
}
socket = null;
return _404();
}
}
[DEBUG] 2019-09-01 16:50:08,304 method:com.jasey.reverse.client.core.local.LocalHostSender.send(LocalHostSender.java:18)
receive http request :
GET /examples HTTP/1.1
Host: localhost:8080
Cache-Control: no-cache
Postman-Token: 60236fcd-995c-49d9-896c-f88a1bdfbfd3
[DEBUG] 2019-09-01 16:50:28,364 method:com.jasey.reverse.client.core.local.LocalHostSender.send(LocalHostSender.java:37)
receive response :
HTTP/1.1 302
Location: /examples/
Transfer-Encoding: chunked
Date: Sun, 01 Sep 2019 08:50:08 GMT
0
HTTP/1.1 302
Location: /examples/
Transfer-Encoding: chunked
Date: Sun, 01 Sep 2019 08:50:08 GMT
0
代码结果日志如下所示:
public void httpTest(){
Socket socket = new Socket("localhost", 8080);
data = "GET /examples HTTP/1.1\n" +
"Host: localhost:8080\n" +
"Cache-Control: no-cache\n" +
"Postman-Token: 60236fcd-995c-49d9-896c-f88a1bdfbfd3\n\n".getBytes();
log.debug("receive http request :\r\n{}", new String(data));
try {
//向服务器端发送数据
DataOutputStream out = new DataOutputStream(socket.getOutputStream());
out.write(data);
out.flush();
//读取服务器端数据
DataInputStream input = new DataInputStream(socket.getInputStream());
byte[] result = readStream(input);
log.debug("receive response :\r\n{}", new String(result));
input.close();
out.close();
return result;
} catch (Exception e) {
log.error("请求本地服务数据异常, ", e);
if (socket != null) {
try {
socket.close();
} catch (IOException e2) {
socket = null;
log.error("客户端关闭socket异常, " ,e);
}
}
socket = null;
return _404();
}
}
[DEBUG] 2019-09-01 16:50:08,304 method:com.jasey.reverse.client.core.local.LocalHostSender.send(LocalHostSender.java:18)
receive http request :
GET /examples HTTP/1.1
Host: localhost:8080
Cache-Control: no-cache
Postman-Token: 60236fcd-995c-49d9-896c-f88a1bdfbfd3
[DEBUG] 2019-09-01 16:50:28,364 method:com.jasey.reverse.client.core.local.LocalHostSender.send(LocalHostSender.java:37)
receive response :
HTTP/1.1 302
Location: /examples/
Transfer-Encoding: chunked
Date: Sun, 01 Sep 2019 08:50:08 GMT
0
HTTP/1.1 302
Location: /examples/
Transfer-Encoding: chunked
Date: Sun, 01 Sep 2019 08:50:08 GMT
0
我不知道为什么,请帮助我响应代码302表示重定向。邮递员可能会跟踪它,给你结果
在我看来,在这些情况下,最简单的事情是使用一个简单的库(如ApacheHttpClient)发出请求
以下是学习HttpClient库的有用教程:
这里介绍如何自动执行重定向:302表示重定向响应。只需遵循重定向。最可能的原因是邮递员会自动遵循重定向,并在您没有注意到的情况下向/examples/发出第二个请求。如果你想做和邮递员一样的事情,也要遵循重定向,即读取响应中的位置头,然后向该位置发送第二个GET请求。或者使用一个实际的HTTP客户端库来为您实现这一点。谢谢您的帮助!重定向/示例/!出于某种原因,每个人都喜欢ApacheHTTPD客户机库,但我发现它比只使用内置的java.net.HttpURLConnection复杂得多。但无论哪种方式,最好使用理解HTTP的组件,而不是使用裸套接字进行通信。