如何在Java中发送Https Post请求

38

我想从Java代码登录到应用程序。 这是我的代码...

String httpsURL = "https://www.abcd.com/auth/login/";

String query = "email="+URLEncoder.encode("abc@xyz.com","UTF-8"); 
query += "&";
query += "password="+URLEncoder.encode("abcd","UTF-8") ;

URL myurl = new URL(httpsURL);
HttpsURLConnection con = (HttpsURLConnection)myurl.openConnection();
con.setRequestMethod("POST");

con.setRequestProperty("Content-length", String.valueOf(query.length())); 
con.setRequestProperty("Content-Type","application/x-www- form-urlencoded"); 
con.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0;Windows98;DigExt)"); 
con.setDoOutput(true); 
con.setDoInput(true); 

DataOutputStream output = new DataOutputStream(con.getOutputStream());  


output.writeBytes(query);

output.close();

DataInputStream input = new DataInputStream( con.getInputStream() ); 



for( int c = input.read(); c != -1; c = input.read() ) 
System.out.print( (char)c ); 
input.close(); 

System.out.println("Resp Code:"+con .getResponseCode()); 
System.out.println("Resp Message:"+ con .getResponseMessage()); 

但我无法登录,它只返回登录页面。

如果有人能帮忙理解我到底做错了什么,请帮帮我。


我猜你的登录页面上有一个表单。如果你将数据发送到包含表单的页面,什么也不会发生。你必须将数据发送到接收表单数据的页面。 - 11684
警告:Content-length应包含以字节为单位的大小。根据“query”的内容,query.length()和query.getBytes().length可能相同,也可能不同。应使用后者。 - Javier Sedano
2个回答

30

有误:(在www- form中间有额外的空格)

con.setRequestProperty("Content-Type","application/x-www- form-urlencoded"); 

正确

 con.setRequestProperty("Content-Type","application/x-www-form-urlencoded"); 

两者看起来一样,有什么区别吗? - sunleo
2
@sunleo 我需要将一个JSON数据作为HTTPS请求的POST数据发送。我尝试将JSON转换为字符串并将其写入outputStream,但请求会抛出400状态错误。有人知道这个错误是什么吗? - Muthu
也许你应该发送的不是 application/x-www-form-urlencoded,而是 application/json 作为 content-type。 - user2501323

0

你可能会因为几个原因而获得 400 错误,但通常是因为数据格式不正确(也许需要 XML?)。也许记录已经存在。使用 Postman 尝试一下,看看你会得到什么结果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接