おそらくこれはしばしば問題ですが、私はそれを解決できません。サーバーから渡された Web フォームのいくつかのフィールドに自動的に入力する必要があります。私は Apache HttpClient を使用して生活を楽にしています) ここまでで、目的を達成するための手順を検討できます。
-
1. http://trac.edgewall.org/ への証明書がないため、このソフトウェアをダウンロードしてローカルにインストールし、最後に NewTicket を作成する必要があります。
-
2. SSL (SSL トンネル) なしで Trac をローカルで使用しています。(HTTPS を使用できるようにプログラムを変更することは難しくありません)。
-
3. これで、GET 要求を認証して実行できますが、POST 要求を実行できません。
-
4. 例: http://localhost:8000/tracenvir/newticketに対して GET リクエストを実行します。この (~/newticket) ページは次のようになります
: http://s04.radikal.ru/i177/0912/cb/d43971cebc02.png
-
"input type="text" id="field-summary" name="field_summary" size="70" "
- "textarea id="field-description" name="field_description" class="wikitext" rows="10" cols="68"/textarea"'
- 5. だから、私はこれを書きます:
int status = 0;
int cookLength=0;
Cookie[] cookies = null;
HttpClient client = new HttpClient();
client.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY);
HttpState initialState = new HttpState();
client.setState(initialState);
//**********//
//**Log in**//
//**********//
GetMethod login = new GetMethod("http://localhost:8000/tracenvir/login");
client.getState().setCredentials(AuthScope.ANY,
new UsernamePasswordCredentials("rauch", "qwert"));
login.setDoAuthentication(true);
System.setProperty("javax.net.ssl.trustStore", "/home/rauch/NetBeansProjects/jssecacerts");
try {
status = client.executeMethod(login);
System.out.println("response code = "+status);
cookies = client.getState().getCookies();
cookLength = cookies.length;
for(int i=0;i (less than) cookLength;i++) {
System.out.println(cookies[i].toString());
}
login.releaseConnection();
} catch(IOException ex) {
ex.printStackTrace();
}
//*********************//
//**Create New Ticket**//
//*********************//
PostMethod post = new PostMethod("http://localhost:8000/tracenvir/newticket");
NameValuePair[] data = {
new NameValuePair("field-summary","second error"),
new NameValuePair("field-descryption","Some stupid descryption..."),
new NameValuePair("field-type","defect"),
new NameValuePair("field-priority","major"),
new NameValuePair("field-version","1.0"),
new NameValuePair("field-owner","moscow server"),
new NameValuePair("submit","create ticket"),
};
//post.setRequestBody(data);
post.addParameters(data);
post.addRequestHeader("Referer","http://localhost:8000/tracenvir/login");
for(int i=0;i (less than) cookLength;i++) {
initialState.addCookie(cookies[i]);
}
client.setState(initialState);
try {
status = client.executeMethod(post);
System.out.println("response code = "+status);
byte[] buf = new byte[10];
int r=0;
BufferedInputStream is = new BufferedInputStream(post.getResponseBodyAsStream());
while((r = is.read(buf)) > 0) {
System.out.write(buf, 0, r);
}
post.releaseConnection();
} catch(IOException ex) {
ex.printStackTrace();
}
}
そして、私はこれを持っています:
-
400 エラー: 不正なリクエスト
-
フォーム トークンがないか無効です。クッキーを有効にしていますか?
どうしたの?
- GET リクエストの応答として、次のように取得します。
- 応答コード = 200 trac_auth=38144ec2830678183afebf0b14c51721
-
trac_form_token=e9648f17987551b8f97e1953
おそらく私はこれを変更する必要があります:
- client.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY);