0

Web サイトに登録するためのフォームにデータを投稿する自動システムを作成しています。

    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 は単なる request attributes であると考え、それに応じてコーディングしました。しかし、ビューソースを詳しく調べたところ、それらがフォーム属性であることがわかりました。私はそのフォームにアクセスできません。ユーザーがサイトに登録されるように、データをフォームに投稿するにはどうすればよいですか?

フォームビーンに値を設定する必要があります。あなたの提案を提供してください。

4

6 に答える 6

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コミュニティウィキで非常に包括的なチュートリアルを見つけることができます: java.net.URLConnectionを使用してHTTPリクエストを起動および処理する

于 2012-07-26T16:25:01.680 に答える
0

ユーザー エージェントを変更して、ブラウザーになりすますことを試みます。ウォルマートには、自動化された方法でこれを行っていることを検出するセキュリティ メカニズムがある場合があります。

(ユーザー エージェントの設定に問題がある場合は、この投稿を参照してください: Java URLConnection のユーザー エージェントの設定)

于 2012-08-02T02:31:11.977 に答える
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

コメントで説明した「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" によって、呼び出しが成功しなくなります。

ところで:

アクセスがロックされている場合、403 ではなく 500 エラーが発生することは珍しくありません。

あなたはおそらく WallMart の Web サイトを所有しておらず、サード パーティのアクセスから保護する価値のあるレベルの Web サイトにアクセスしようとしているので、これが当てはまる可能性があります。;)

PS: このように AccountLogin 番号を公開するのが賢明かどうかはわかりません。結局のところ、これは特定の WallMart アカウント所有者のクライアント ID です。でもねえ、それはあなたの選択であって、私のものではありません。

于 2012-08-01T17:17:15.673 に答える
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

また、送信するパラメータを再確認してください。サーバーが実行している入力データに対していくつかの検証が行われる場合があります。たとえば、一部のフィールドは必須で、一部は数値のみなどです。

于 2012-08-02T02:08:15.173 に答える