我在Java中通过HTTPS发布数据时遇到问题。无论我是否发送'查询',服务器响应都是相同的。也许有人可以指出问题是什么......
谢谢!
主要课程:
package bind;
public class Main {
public static final String urlString = "https://www.sms.ethz.ch/cgi-bin/sms/send.pl";
public static void main(String[] args) {
Message msg = new Message("Alles klar?");
URL url = new URL(urlString);
String[][] values = new String[3][2];
values[0][0] = "action";
values[0][1] = "listoriginators";
values[1][0] = "username";
values[1][1] = "xxxxxx";
values[2][0] = "password";
values[2][1] = "xxxxxx";
Query query = new Query(values);
System.out.println("Query: " + query.getQuery());
Request request = new Request(url.getURL(), query.getQuery());
}
}
请求类:
package bind;
public class Request {
static private int ic = 0;
private URL url;
protected Request(java.net.URL URL, String query){
ic++;
if(CONSTANTS.SHOW_LOGS) { System.out.println("log: new instance of 'Message'"); }
// connect
try {
System.setProperty("java.protocol.handler.pkgs", "com.sun.net.ssl.internal.www.protocol");
java.security.Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
javax.net.ssl.HttpsURLConnection connection = (javax.net.ssl.HttpsURLConnection) URL.openConnection();
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setRequestMethod("POST");
connection.setFollowRedirects(true);
connection.setRequestProperty("Content-Length", String.valueOf(query.length()));
connection.setRequestProperty("Content-Type", "application/x-www- form-urlencoded");
connection.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
java.io.DataOutputStream output = new java.io.DataOutputStream(connection.getOutputStream());
output.writeBytes(query); // <<-- NOTHING CHANGES IF I COMMENT THIS OUT OR NOT !!??!?!
System.out.println("log: response code: " + connection.getResponseCode());
System.out.println("log: response message: " + connection.getResponseMessage());
java.io.DataInputStream input = new java.io.DataInputStream(connection.getInputStream());
for(int i = input.read(); i != -1; i = input.read()) {
System.out.print((char)i);
}
System.out.print("\n");
input.close();
} catch(java.io.IOException e) {
if(CONSTANTS.SHOW_LOGS) {
System.out.println("error: unable to connect");
System.out.println(e);
e.printStackTrace();
}
}
}
}
网址类:
public class URL {
static private int ic = 0;
private String URLString;
private java.net.URL url;
protected URL(String a_url){
ic++;
if(CONSTANTS.SHOW_LOGS) { System.out.println("log: new instance of 'URL'"); }
setURLString(a_url);
createURL();
}
private void setURLString(String a_url) {
URLString = a_url;
}
private void createURL() {
try {
url = new java.net.URL(URLString);
} catch(java.net.MalformedURLException e) {
System.out.println("error: invalid URL");
System.out.println(e);
e.printStackTrace();
}
}
private void showURL() {
System.out.println("URL: " + url.getHost() + url.getPath());
}
public java.net.URL getURL() {
return url;
}
}
PS:主要来自这里:http://www.java-samples.com/java/POST-toHTTPS-url-free-java-sample-program.htm
答案 0 :(得分:2)
之后忘记了flush()
或更好,close()
的流(已经进行了隐式刷新)。刷新是必要的,因为数据可以在内部缓冲到一定长度,并且刷新强制整个缓冲区实际写入输出。
所以,改变
output.writeBytes(query);
到
output.writeBytes(query);
output.close();
实际上,正常的习惯用法就是在您获取finally
块的try
块时关闭它们,这样您就可以保证在IOException
时它们会被关闭在写入期间发生。关闭非常重要,因为它可以释放系统资源。
Stream stream = null; // Can be InputStream, OutputStream, Reader or Writer.
try {
stream = new SomeStream();
// ...
} finally {
if (stream != null) try { stream.close(); } catch (IOException logOrIgnore) {} // You can if necessary bake an utility method taking Closeable or take a look for commons IO.
}
另请参阅Sun Java IO tutorial了解更多基础课程和指南。
答案 1 :(得分:1)