我正在使用java.net在我的Java客户端发送HTTP请求,但我仍然无法实现/找到如何实际触发请求。
例如我有这段代码:
Scanner sc = new Scanner(System.in);
System.out.println("Deleting subject...");
System.out.println("Subject shortcut (-1 for return):");
String shortcut = sc.next();
if( shortcut.equals("-1") )
return ;
try
{
URL url = new URL( "http://localhost:8080/Server/webresources/subject/delete/"+shortcut );
HttpURLConnection con = (HttpURLConnection)url.openConnection();
con.setDoOutput(true);
con.setRequestMethod("DELETE");
BufferedReader br = new BufferedReader( new InputStreamReader( con.getInputStream() ) );
System.out.println( br.readLine() );
}catch( Exception e )
{
System.out.println(e.getMessage());
}
在此代码中,如果我不使用这些行:
BufferedReader br = new BufferedReader( new InputStreamReader( con.getInputStream() ) );
System.out.println( br.readLine() );
永远不会发送请求。因此,在这种情况下,请求似乎是通过从连接调用InputStream来触发的。
任何人都可以解释一下如何通过java.net发出HTTP请求吗?
答案 0 :(得分:5)
从文档中,如果您拨打connect(),或者如果您调用依赖于连接的操作,HttpURLConnection
将会连接getInputStream()
。
打开指向此网址引用的资源的通讯链接,如果 这种联系尚未建立。如果连接 连接已被打开时调用方法 (由具有值true的连接字段表示),呼叫是 忽略。
URLConnection对象经历两个阶段:首先创建它们, 然后他们相互联系。在创建之后,在之前 连接后,可以指定各种选项(例如,doInput和 的useCaches)。连接后,尝试设置它们是错误的。 依赖于连接的操作,例如getContentLength,会 如有必要,隐式执行连接。
但是,有几个主题表明connect()
不会提交实际请求,而是getInputStream()
(很可能是任何读取服务器响应的方法,例如getResponseCode()
}),将:
Java URLConnection - When do I need to use the connect() method?
答案 1 :(得分:0)
每次调用此URL的协议处理程序的URLStreamHandler.openConnection(URL)方法时,都会创建一个新的URLConnection实例。
应该注意,URLConnection实例在创建时不会建立实际的网络连接。只有在调用URLConnection.connect()时才会发生这种情况。 see javadoc
String url = "http://example.com";
URL obj = new URL(url);
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
//add request header
con.setRequestProperty("User-Agent", USER_AGENT);
int responseCode = con.getResponseCode();