2012-07-23 26 views
0

蔭創建自動化系統發佈數據的形式登記到網站如何發佈數據,以形成在其他的服務器

URL url = new URL("https://www.walmart.com/subflow/YourAccountLoginContext/1471476370/sub_generic_login/create_account.do"); 
String postData = "firstName="+xlsDataList.get(0)+"&lastName="+xlsDataList.get(1)+"&userName="+xlsDataList.get(2)+"&userNameConfirm="+xlsDataList.get(3)+"&pwd="+xlsDataList.get(5)+"&pwdConfirm="+xlsDataList.get(6); 
HttpsURLConnection uc = (HttpsURLConnection) url.openConnection(); 
uc.setDoInput(true); 
uc.setDoOutput(true); 
uc.setRequestMethod("POST"); 
uc.setRequestProperty("Accept", "*/*"); 
uc.setRequestProperty("Content-Length", Integer.toString(postData.getBytes().length)); 
uc.setRequestProperty("Content-Type", "text/html; charset=utf-8"); 
OutputStreamWriter outputWriter = new OutputStreamWriter(uc.getOutputStream()); 
outputWriter.write(postData); 
outputWriter.flush(); 
outputWriter.close(); 

我認爲上述POSTDATA只是要求屬性,相應編碼。但仔細檢查視圖源後,我才知道這些是表單屬性。 我不能訪問該表單。現在我怎樣才能將數據發佈到表單中,以便用戶通過網站進行註冊?

我必須將值設置爲formbean。 請提供您的建議。

+0

當你運行該代碼你什麼反應? – Santosh 2012-07-26 12:13:29

+0

獲取狀態代碼爲500 – developer 2012-07-26 14:58:44

+1

做一件事。安裝[Firebug](http://getfirebug.com/)。你將需要firefox。現在從瀏覽器提交該表單並觀察網絡流量。查找帖子請求。這會讓你知道所有提交給服務器的字段。 – Santosh 2012-07-26 15:04:15

回答

0

我推薦使用Apache HttpClient。它更快,更容易實施。

PostMethod post = new PostMethod("https://www.walmart.com/subflow/YourAccountLoginContext/1471476370/sub_generic_login/create_account.do"); 
    NameValuePair[] data = { 
     new NameValuePair("firstName", "joe"), 
     new NameValuePair("lastName", "bloggs") 
    }; 
    post.setRequestBody(data); 
    InputStream in = post.getResponseBodyAsStream(); 
    // handle response. 

有關詳細信息,你可以參考http://hc.apache.org/

+0

你確定將值設置爲formbean嗎? – developer 2012-07-23 08:49:12

2

你正在使用您的POST錯誤Content-Type:你需要使用application/x-www-form-urlencoded。一旦你改變了這一點,服務器會將你的請求體解釋爲請求參數,並且(很可能)你的「formbean」將被填充數據。

上面的代碼可能是一個測試用例,但您真的應該注意正確編碼您嘗試POST的所有數據。否則,您可能會面臨語法無效的請求(在這種情況下,服務器將拒絕請求或忽略重要參數),或者引入一個安全漏洞,用戶可以在POST中注入任意請求參數。我強烈推薦的代碼看起來像這樣:

import java.net.URLEncoder; 

String charset = "UTF-8"; // Change this if you want some other encoding 
StringBuilder postData = new StringBuilder(); 
postData.append(URLEncoder.encode("firstName", charset)); 
postData.append("="); 
postData.append(URLEncoder.encode(xlsDataList.get(0)), charset); 
postData.append("&"); 
postData.append(URLEncoder.encode("lastName", charset)); 
postData.append("="); 
postData.append(URLEncoder.encode(xlsDataList.get(1), charset)); 
postData.append("&"); 
postData.append(URLEncoder.encode("userName", charset)); 
postData.append("="); 
postData.append(URLEncoder.encode(xlsDataList.get(2), charset)); 
postData.append("&"); 
postData.append(URLEncoder.encode("userNameConfirm", charset)); 
postData.append("="); 
postData.append(URLEncoder.encode(xlsDataList.get(3), charset)); 
postData.append("&"); 
postData.append(URLEncoder.encode("pwd", charset)); 
postData.append("="); 
postData.append(URLEncoder.encode(xlsDataList.get(5), charset)); 
postData.append("&"); 
postData.append(URLEncoder.encode("pwdConfirm", charset)); 
postData.append("="); 
postData.append(xlsDataList.get(6), charset)); 

看來愚蠢編碼的靜態字符串,如「userNameConfirm」,但如果你進入這個習慣,你最終會使用它所有的時間和你的代碼會更安全。

此外,你需要確保你通過OutputStream發送數據有權Content-Length:你計算內容長度正常,但你不使用你用於計算的字節發送給客戶。你希望你的代碼看起來更象這樣:

byte[] postDataBytes = postData.getBytes(charset); 
uc.setRequestProperty("Content-Length", Integer.toString(postDataBytes.length)); 
uc.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 
OutputStream outputStream = uc.getOutputStream(); 
outputStream.write(postDataBytes); 
outputStream.flush(); 
outputStream.close(); 

你可以找到在社區維基一個非常全面的HTTPUrlConnection教程:Using java.net.URLConnection to fire and handle HTTP requests

+0

也許用* postData.append(「&"); *」)替換* postData.append(「&」); *以使其完美 – 2012-08-01 17:10:35

+0

@ e-sushi'&'和'='明確允許作爲x-www中的分隔符-forma-urlencoded,不應該被轉義,另外,「&」是一個XML實體,它是URL編碼的錯誤編碼類型; URL編碼使用百分比編碼的十六進制數字代替 – Alex 2012-08-01 17:40:34

+0

@Alex Oops,你是對的。我忘了RFC 3986的細節。我的壞,抱歉,不會因爲非法訪問企圖而改變他的Error 500問題;) – 2012-08-01 17:56:07

0

如果你的項目使用Spring 3.x或更高,我會建議使用Spring RestTemplate對於做http非常方便,下面的代碼將會記錄下來。

public String login(String username, String password) 
    { 
     MultiValueMap<String, String> form = new LinkedMultiValueMap<>(); 
     form.add(usernameInputFieldName, username); 
     form.add(passwordInputFieldName, password); 
      RestTemplate template = new RestTemplate(); 
     URI location = template.postForLocation(loginUrl(), form); 
     return location.toString(); 
    } 
0

您在評論中描述的「HTTP錯誤500」是「內部服務器錯誤」。

這意味着服務器無法使用您的請求(GET/POST),或者您嘗試呼叫的服務器存在特定的問題。

考慮看看你調用的URL,我立刻相同的錯誤500

同樣的情況,兩個GET和POST httqs請求://www.walmart.com/subflow/YourAccountLoginContext/1471476370/sub_generic_login/CREATE_ACCOUNT。(停用實時鏈接;將「q」替換爲「p」以使其工作)。

總之:一般來自WallMart服務器的返回「HTTP Error 500」阻止您的呼叫成功。

順便說一句:

的情況並不少見,以得到一個錯誤,而不是500 403,如果他們被鎖定您的訪問了。

由於您可能沒有擁有WallMart網站,並且您嘗試訪問其網站的價值受到第三方訪問保護的級別,所以很可能是這種情況。 ;)

PS:我不確定明智地顯示AccountLogin號碼是否明智這樣。畢竟,這是一個特定WallMart賬戶持有人的客戶ID。但是,嘿,那是你的選擇,不是我的。

0

此外,仔細檢查您發送的參數。服務器正在進行的輸入數據可能會有一些驗證。例如,某些字段是強制性的,有些字段只是數字等。

0

嘗試通過修改用戶代理作爲瀏覽器進行欺騙。 WalMart可能有一個安全機制,可以自動檢測你是否正在做這件事。

(如果你有問題設置用戶代理看到這個帖子:Setting user agent of a java URLConnection

相關問題