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。请提供您的建议。

4

6 回答 6

2

您在 POST 中使用错误Content-Type:您需要使用application/x-www-form-urlencoded. 更改后,服务器会将您的请求正文解释为请求参数,并且(可能)您的“formbean”将填充数据。

上面的代码可能是一个测试用例,但您确实应该注意正确编码您尝试发布的所有数据。否则,您将面临语法无效请求(在这种情况下,服务器将拒绝请求或忽略重要参数)或引入安全漏洞,用户可以将任意请求参数注入您的 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您可以在社区 wiki中找到非常全面的教程:使用 java.net.URLConnection 触发和处理 HTTP 请求

于 2012-07-26T16:25:01.680 回答
0

通过修改用户代理尝试欺骗浏览器。沃尔玛可能有一种安全机制,可以检测到您正在以自动方式执行此操作。

(如果您在设置用户代理时遇到问题,请参阅这篇文章:设置 java URLConnection 的用户代理

于 2012-08-02T02:31:11.977 回答
0

此外,请仔细检查您发送的参数。服务器正在对输入数据进行一些验证。例如,有些字段是强制性的,有些只是数字,等等。

于 2012-08-02T02:08:15.173 回答
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();
    }
于 2012-08-01T09:18:47.880 回答
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/

于 2012-07-23T08:42:07.863 回答
0

您在评论中描述的“HTTP 错误 500”是“内部服务器错误”。

这意味着服务器要么无法使用您的请求 (GET/POST),要么存在特定于您尝试调用的服务器的问题。

看看你调用的 URL,我立即出现了同样的错误 500。

httqs://www.walmart.com/subflow/YourAccountLoginContext/1471476370/sub_generic_login/create_account.do 上的 GET 和 POST 请求也是如此(实时链接已停用;将“q”替换为“p”以使其正常工作。)

简而言之:WallMart 服务器通常返回的“HTTP 错误 500”会阻止您的调用成功。

顺便一提:

如果他们锁定您的访问权限,则收到错误 500 而不是 403 的情况并不少见。

由于您可能不拥有 WallMart 网站,并且由于您正在尝试访问其网站的值得保护免受 3rd 方访问的级别,因此很可能就是这种情况。;)

PS:我不确定像这样在公共场合显示 AccountLogin 号码是否明智。毕竟,它是特定 WallMart 帐户持有人的客户 ID。但是,嘿,这是你的选择,不是我的。

于 2012-08-01T17:17:15.673 回答