Java 如何将数据发布到其他服务器中的表单

Java 如何将数据发布到其他服务器中的表单,java,https,forms,http-post,Java,Https,Forms,Http Post,Iam正在创建自动系统,将数据发布到表单,以便注册到网站 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)+"&

Iam正在创建自动系统,将数据发布到表单,以便注册到网站

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

我建议使用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.

有关详细信息,请参阅您的帖子中使用了错误的
内容类型:您需要使用
application/x-www-form-urlencoded
。一旦您更改了这个参数,服务器将把您的请求主体解释为请求参数,并且(很可能)您的“formbean”将被数据填充

上面的代码可能是一个测试用例,但您确实应该注意对您试图发布的所有数据进行正确编码。否则,您将面临以下风险:要么是请求语法无效(在这种情况下,服务器将拒绝请求,要么忽略重要参数),要么是引入安全漏洞,用户可以将任意请求参数插入到您的帖子中。我强烈推荐如下代码:

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));
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();
将静态字符串编码为“userNameConfirm”似乎很愚蠢,但如果你养成了这样的习惯,你最终会一直使用它,你的代码会更安全

此外,您需要确保通过
OutputStream
发送的数据具有正确的
Content Length
:您正确计算了内容长度,但没有使用用于计算的字节发送到客户端。您希望您的代码看起来更像这样:

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));
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();

您可以在社区wiki中找到一个非常全面的
HTTPUrlConnection
教程:

如果您的项目使用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();
    }
公共字符串登录(字符串用户名、字符串密码)
{
MultiValueMap form=新链接的MultiValueMap();
添加(用户名输入字段名,用户名);
添加(passwordInputFieldName,password);
RestTemplate=新的RestTemplate();
URI location=template.postForLocation(loginUrl(),form);
返回位置.toString();
}
您在评论中描述的“HTTP错误500”是一个“内部服务器错误”

这意味着服务器无法使用您的请求(GET/POST),或者您试图调用的服务器存在特定的问题

查看一下您正在调用的URL,我立即发现了相同的错误500

在上的GET和POST请求也会发生相同的情况httqs://www.walmart.com/subflow/YourAccountLoginContext/1471476370/sub_generic_login/create_account.do (实时链接已停用;将“q”替换为“p”以使其工作。)

简而言之:通常从沃尔玛服务器返回的“HTTP错误500”会阻止您的呼叫成功

顺便说一下:

如果他们锁定了您的访问权限,那么出现错误500而不是403的情况并不少见

由于您可能并不拥有沃尔玛网站,而且您正试图访问其网站的级别,这些级别值得保护,不受第三方访问,因此很可能就是这种情况。;)


PS:我不确定这样公开显示帐户登录号是否明智。毕竟,它是特定沃尔玛账户持有人的客户ID。但是,这是你的选择,不是我的。

另外,请仔细检查您发送的参数。服务器正在对输入数据进行一些验证。例如,某些字段是必填字段,某些字段仅为数字,等等。

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


(如果您在设置用户代理时遇到问题,请参阅本文:)

您确定会将值设置为formbean吗?运行此代码时会得到什么响应?请做一件事。安装。你需要firefox。现在从浏览器提交该表单并观察网络流量。寻找post请求。这将使您了解提交到服务器的所有字段。可能会替换postData.append(“&”);使用postData.append(“&;”);为了使其更完美,在x-www-form-urlencoded中,@e-sushi'&'和'='被明确允许作为分隔符,不应转义。另外,“&;”是一个XML实体,对于URL编码来说,它的编码类型是错误的;URL编码使用百分比编码的十六进制数字。@AlexOOPS,您是正确的。我忘记了RFC3986的细节。我的错,对不起。由于非法访问尝试,不会更改错误500问题。;)