Eclipseで単純なJavaプロジェクト(動的Webプロジェクトではない)を作成しました。
いくつかのJSON値を返すWebURLにアクセスできるようにしたいと思います。
HttpClientなどを使用してURLにアクセスできますが、JSONデータにアクセスするために必要なセッションを認証できません。認証されていない場合、URLはログインページにリダイレクトします。
セッションを認証するためのさまざまな方法を試しましたが、どれも機能していないようです。常に、JSONではなくログインページのHTMLデータを取得することになります。
また、JSESSION IDがリクエストヘッダーに渡されることにも気づきましたが、JSESSION IDを作成する方法と、それをGETリクエストに渡す方法がわからないようです。
したがって、基本的に、この問題は2つの方法で解決できます。
- セッションを認証してから、URLにアクセスしてJSONを取得します
- JSESSION IDを作成し、それをGETリクエストに渡してJSONを取得します
誰もがどちらかを行う方法を知っていますか?
最終的に、JSONから収集したデータを使用してSeleniumテストを実行したいので、これをすべて動的Webプロジェクト(Eclipse)内で実行する必要がありますか、それとも通常のJavaプロジェクト内で実行できますか?
試行1
URL url = new URL(_url);
InputStream ins = url.openConnection().getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(ins));
StringBuilder builder = new StringBuilder();
for (String line = null; (line = reader.readLine()) != null;) {
builder.append(line).append("\n");
}
System.out.println("RESPONSE:\n\n" + builder);
JSONTokener tokener = new JSONTokener(builder.toString());
JSONArray finalResult = new JSONArray(tokener);
System.out.println("JSON:\n\n" + finalResult.toString());
試行1の結果
ログインページのHTMLコードを印刷してしまうと、ページにJSONがないため、次のエラーメッセージが表示されます。
Exception in thread "main" org.json.JSONException: A JSONArray text must start with '[' at character 1
試行2
OracleのHttpAuthenticationページにあるコードも試しました。
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Authenticator;
import java.net.PasswordAuthentication;
import java.net.URL;
public class RunHttpSpnego {
static final String kuser = "username"; // your account name
static final String kpass = "password"; // your password for the account
static class MyAuthenticator extends Authenticator {
public PasswordAuthentication getPasswordAuthentication() {
// I haven't checked getRequestingScheme() here, since for NTLM
// and Negotiate, the usrname and password are all the same.
System.err.println("Feeding username and password for " + getRequestingScheme());
return (new PasswordAuthentication(kuser, kpass.toCharArray()));
}
}
public static void main(String[] args) throws Exception {
Authenticator.setDefault(new MyAuthenticator());
URL url = new URL(args[0]);
InputStream ins = url.openConnection().getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(ins));
String str;
while((str = reader.readLine()) != null)
System.out.println(str);
}
}