HTTP客户端错误请求400
我试图了解HTTP客户机在Java中是如何工作的。我正在尝试构建我自己的客户端,该客户端将向web服务器请求php文件 当前,当我发出请求时,服务器会显示以下错误: HTTP/1.1400错误请求 但是,我可以从浏览器中访问该文件,没有问题。我不知道我可能做错了什么,但我无法理解。下面是我的HTTP客户端类的代码:HTTP客户端错误请求400,http,netbeans,get,httpclient,bad-request,Http,Netbeans,Get,Httpclient,Bad Request,我试图了解HTTP客户机在Java中是如何工作的。我正在尝试构建我自己的客户端,该客户端将向web服务器请求php文件 当前,当我发出请求时,服务器会显示以下错误: HTTP/1.1400错误请求 但是,我可以从浏览器中访问该文件,没有问题。我不知道我可能做错了什么,但我无法理解。下面是我的HTTP客户端类的代码: public class MyHttpClient { MyHttpRequest request; String host; public MyHttpResponse exe
public class MyHttpClient {
MyHttpRequest request;
String host;
public MyHttpResponse execute(MyHttpRequest request) throws IOException {
//Creating the response object
MyHttpResponse response = new MyHttpResponse();
//Get web server host and port from request.
String host = request.getHost();
int port = request.getPort();
//Check 1: HOST AND PORT NAME CORRECT!
System.out.println("host: " + host + " port: " + String.valueOf(port));
//Get resource path on web server from requests.
String path = request.getPath();
//Check 2: ENSURE PATH IS CORRECT!
System.out.println("path: " + path);
//Open connection to the web server
Socket s = new Socket(host, port);
//Get Socket input stream and wrap it in Buffered Reader so it can be read line by line.
BufferedReader inFromServer = new BufferedReader(new InputStreamReader(s.getInputStream()));
//Get Socket output stream and wrap it in a Buffered Writer so it can be written to line by line.
PrintWriter outToServer = new PrintWriter(s.getOutputStream(),true);
//Get request method
String method = request.getMethod();
//Check 3: ENSURE REQUEST IS CORRECT GET/POST!
System.out.println("Method: " + method);
//GET REQUEST
if(method.equalsIgnoreCase("GET")){
//Send request to server
outToServer.println("GET " + path + " HTTP/1.1 " + "\r\n");
String line = inFromServer.readLine();
System.out.println("Line: " + line);
}
//Returning the response
return response;
}
}
如果有人能解释一下这个问题,我将不胜感激!谢谢
对服务器的新请求:
outToServer.print("GET " + path+ " HTTP/1.1" + "\r\n");
outToServer.print("Host: " + host + "\r\n");
outToServer.print("\r\n");
答复:
方法:获取
line: <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
line: <html><head>
line: <title>400 Bad Request</title>
line: </head><body>
line: <h1>Bad Request</h1>
line: <p>Your browser sent a request that this server could not understand.<br />
line: </p>
line: <hr>
line: <address>Apache Server at default.secureserver.net Port 80</address>
line: </body></html>
line: null
行:
行:
行:400错误请求
行:
行:请求错误
行:您的浏览器发送了此服务器无法理解的请求。
行:
行:
行:位于default.secureserver.net端口80的Apache服务器
行:
行:空
我认为您至少需要在请求中添加Host
头
从
标头完成后,还需要传输额外的\r\n
,以便服务器知道请求已完成
不要使用
println
而是print
println
向每行添加另一个\n
,导致行以\r\n\n
终止。请勿使用PrintWriter。你必须写ascii字符
s.getOutputStream().write(("GET " + path + " HTTP/1.1\r\n\r\n").getBytes("ASCII"));
如您所述,我对请求进行了如下调整:
outToServer.println(“GET”+path+“HTTP/1.1”+”\r\n”);println(“主机:“+Host”);outToServer.println(“\r\n”)代码>但仍然出现错误。您忘记了另一个\r\n
。主机头由\r\n
终止,然后头块必须由\r\n
终止。不要使用“println”,而是使用“print”。Println添加了另一个\n
,因此您最终会遇到\r\n\n
,这可能会导致错误。请确保在发送完请求后调用flush():噢,我错过了您使用的PrintWriter。不过,您不需要使用原始OutputStream。能否尝试将第三个参数传递给PrintWriter构造函数:newPrintWriter(s.getOutputStream(),true,“ASCII”)
UTF-8
而不是ASCII
也应该可以。很抱歉,错过了方法-writeFIXED!!非常感谢你!我整天都在做这个。
s.getOutputStream().write(("GET " + path + " HTTP/1.1\r\n\r\n").getBytes("ASCII"));