如何使用HttpURLConnection让这篇HTTP/1.1文章在Java中工作?
我正试图使用如何使用HttpURLConnection让这篇HTTP/1.1文章在Java中工作?,java,http-post,httpurlconnection,Java,Http Post,Httpurlconnection,我正试图使用HttpURLConnection向发送一篇HTTP/1.1文章,以便使用我的用户名和密码登录网站 出于某种原因,它看起来像是没有将byte[]postData发送到服务器 我收到了响应代码和消息200 OK,但服务器以JSON格式的错误消息{“err”:“请键入id和密码”}进行响应,就好像我从未实际发送过数据一样 我尝试了不同的方法(使用不同的输出写入程序发送字符串,字节[]等)来发送数据,但到目前为止,没有一种方法有效,我无法确定它到底在哪里失败 下面是我正在使用的代码片段:
HttpURLConnection
向发送一篇HTTP/1.1文章,以便使用我的用户名和密码登录网站
出于某种原因,它看起来像是没有将byte[]postData
发送到服务器
我收到了响应代码和消息200 OK,但服务器以JSON格式的错误消息{“err”:“请键入id和密码”}进行响应,就好像我从未实际发送过数据一样
我尝试了不同的方法(使用不同的输出写入程序发送字符串
,字节[]
等)来发送数据,但到目前为止,没有一种方法有效,我无法确定它到底在哪里失败
下面是我正在使用的代码片段:
package post;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.nio.charset.Charset;
public class PostTest {
public static void login() throws MalformedURLException, IOException {
String urlParameters = String.format("id=%s&password=%s",
URLEncoder.encode(Config.getProperty("account.1.username"), "UTF-8"),
URLEncoder.encode(Config.getProperty("account.1.password"), "UTF-8")
);
byte[] postData = urlParameters.getBytes(Charset.forName("UTF-8"));
URL url = new URL(Config.getProperty("login.url"));
HttpURLConnection httpConn = (HttpURLConnection)url.openConnection();
httpConn.setDoInput(true);
httpConn.setDoOutput(true);
httpConn.setUseCaches(false);
httpConn.setRequestMethod("POST");
httpConn.setRequestProperty("Content-Length",
Integer.toString(postData.length));
//prints: 26
System.out.println(postData.length);
//prints: id=test&password=123456789
System.out.println(urlParameters);
httpConn.getOutputStream().write(postData);
httpConn.getOutputStream().flush();
try (BufferedReader reader = new BufferedReader(
new InputStreamReader(httpConn.getInputStream()))) {
for (String line; (line = reader.readLine()) != null;)
System.out.println(line);
}
}
}
实时HTTP头文件(Firefox插件)输出:
编辑:添加了Firefox“实时HTTP头文件”输出,我用它来查看通过POST发送的数据
我认为byte[]postData
没有正确发送(如果有的话)是正确的吗
要使登录正常工作,我必须做哪些更改?嗯,我终于注意到了我的错误。因此,我使用localhost/test.php尝试了第一次登录,其中参数是
password=
,我完全忽略了我发送数据到的实际网站使用的是pw=
将
String.format(“id=%s&password=%s”,[…])
更改为String.format(“id=%s&pw=%s”,[…]
它工作起来很有魅力。嗯,我终于注意到了我的错误。因此,我尝试使用localhost/test.php进行第一次登录,其中参数是password=
我完全忽略了我发送数据到的实际网站使用的是pw=
将
String.format(“id=%s&password=%s”,[…]
更改为String.format(“id=%s&pw=%s”,[…]
后,它就像一个符咒一样工作。POST数据不是以URL编码格式发送的;GET数据是。好的,很高兴知道,谢谢。不过,删除urlcoder.encode()
仍然会导致相同的错误回复。我猜用户名和密码的值没有像您所想的那样发送。请检查另一个SO答案-URLEncoder所做的只是…编码。它不会神奇地将URL字符串变成POST请求的样子。POST数据不是以URL编码的格式发送的;GET数据是。好的,很高兴知道,谢谢。不过,删除URLEncoder.encode()
仍然会导致相同的错误回复。我猜用户名和密码的值没有按照您的想法发送。请检查另一个SO答案-URLEncoder所做的只是…编码。它不会神奇地将URL字符串变成POST请求的样子。
POST /io/login HTTP/1.1
Host: uploaded.net
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0
Accept: text/javascript, text/html, application/xml, text/xml, */*
Accept-Language: de,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
X-Requested-With: XMLHttpRequest
X-Prototype-Version: 1.6.1
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Referer: http://uploaded.net/
Content-Length: 20
Cookie: __utma=9[censored...]
Connection: keep-alive
id=test&pw=123456789
HTTP/1.1 200 OK
[...]