簡體   English   中英

如何使用HttpURLConnection將此HTTP / 1.1 POST用於Java?

[英]How do I get this HTTP/1.1 POST to work in Java using HttpURLConnection?

我試圖使用HttpURLConnection將HTTP / 1.1 POST發送到http://uploaded.net/io/login ,以便使用我的用戶名和密碼登錄到該網站。

出於某種原因,看起來像byte[] postData沒有被發送到服務器。

我收到響應代碼和消息200 OK ,但服務器回復JSON格式的錯誤消息{“err”:“請鍵入id和密碼”} ,好像我從未真正發送過數據。

我已經嘗試了不同的方法(發送一個Stringbyte[]等,使用不同的輸出編寫器)發送數據但到目前為止它們都沒有工作,我無法弄清楚它究竟在哪里失敗。

這是我正在使用的代碼片段:

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沒有正確發送,如果有的話,對嗎?

我必須進行哪些更改才能使登錄正常工作?

呃,我終於發現了我的錯誤。 因此我嘗試使用我的localhost / test.php進行第一次登錄,其中參數是password=<pw>我完全忽略了我發送數據的實際網站是使用pw=<pw>

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM