gpt4 book ai didi

JAVA:通过 HTTPS POST 数据似乎没有发送?

转载 作者:行者123 更新时间:2023-12-02 00:52:24 25 4
gpt4 key购买 nike

我在 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();
}
}

}
}

URL 类别:

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

最佳答案

您忘记了之后flush(),或者更好的是close()流(它已经执行了隐式刷新)。刷新是必要的,因为数据可能会在内部缓冲到一定长度,并且刷新会强制将整个缓冲区实际写入输出。

所以,改变

 output.writeBytes(query);

 output.writeBytes(query);
output.close();

实际上,正常的习惯用法是在获取流后在 try block 的 finally block 中关闭它们,这样就可以保证它们被关闭每当写入期间发生 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了解更多基本类(class)和指南。

关于JAVA:通过 HTTPS POST 数据似乎没有发送?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2481499/

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