【问题标题】:How do I get this HTTP/1.1 POST to work in Java using HttpURLConnection?如何使用 HttpURLConnection 让这个 HTTP/1.1 POST 在 Java 中工作?
【发布时间】:2016-03-11 04:25:52
【问题描述】:

我正在尝试使用 HttpURLConnectionhttp://uploaded.net/io/login 发送 HTTP/1.1 POST,以便使用我的用户名和密码登录网站。

由于某种原因,byte[] postData 似乎没有被发送到服务器。

我收到了响应码和消息200 OK,但是服务器回复了JSON格式的错误消息{"err":"Please type in id and password"} 就好像我从未真正发送过数据一样。

我尝试了不同的发送数据的方法(发送Stringbyte[] 等,使用不同的输出写入器),但到目前为止它们都没有奏效,我无法弄清楚它到底在哪里失败.

这是我正在使用的代码 sn-p:

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 插件)输出:

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
[...]

编辑:添加了 Firefox 的 Live HTTP Headers 输出,用于查看通过 POST 发送的数据。

我假设byte[] postData 没有正确发送,如果有的话,正确吗?

我必须进行哪些更改才能使登录正常工作?

【问题讨论】:

  • POST 数据不是以 URL 编码格式发送的; GET 数据是。
  • 好的,很高兴知道,谢谢。但是,删除 URLEncoder.encode() 仍然会导致相同的错误回复。
  • 我猜用户名和密码的值并没有像你想象的那样被发送。
  • 请查看其他 SO 答案 - stackoverflow.com/questions/9767952/…
  • URLEncoder 所做的只是……编码。它不会神奇地将 URL 字符串变成 POST 请求的样子。

标签: java http-post httpurlconnection


【解决方案1】:

呃,我终于注意到我的错误了。因此,我使用我的 localhost/test.php 尝试了第一次登录,其中参数是 password=<pw> 我完全忽略了我发送数据的实际网站正在使用 pw=<pw>

String.format("id=%s&password=%s", [...] 更改为String.format("id=%s&pw=%s", [...] 后,它就像一个魅力。

【讨论】:

    猜你喜欢
    • 2021-01-03
    • 1970-01-01
    • 2019-04-07
    • 2013-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-13
    • 2020-08-16
    相关资源
    最近更新 更多