使用 Java org.apache.http.client 获取重定向 url

发布于 2024-08-17 04:08:22 字数 1650 浏览 4 评论 0原文

我需要帮助来弄清楚如何在向服务器发布帖子后获取重定向。 首先,我需要执行 get 从服务器获取一些 cookie。然后我使用 cookie 和其他参数执行发布。然后服务器以 302 重定向进行应答。如何获取该重定向的 url?

代码如下:

HttpGet get = new HttpGet(urlOne);

try {
    //Creating a local instance of cookie store.
    CookieStore cookieJar = new BasicCookieStore();

    // Creating a local HTTP context
    HttpContext localContext = new BasicHttpContext();

    // Bind custom cookie store to the local context
    localContext.setAttribute(ClientContext.COOKIE_STORE, cookieJar);

    HttpResponse response = httpClient.execute(get, localContext);
    HttpEntity entity = response.getEntity();

    System.out.println("------------------GET----------------------");
    System.out.println(response.getStatusLine());
    if (entity != null) {
        System.out.println("Response content length: " + entity.getContentLength());
    }

    // Print out cookies obtained from server
    List<Cookie> cookies = cookieJar.getCookies();
    for (int i = 0; i < cookies.size(); i++) {
        System.out.println("Local cookie: " + cookies.get(i));
    }        

    if (entity != null) {
       entity.consumeContent();
    }
    System.out.println("------------------GET-END---------------------");

    // Create a new post
    HttpPost post = new HttpPost(urlTwo);
    post.setHeader("Content-Type", "application/x-www-form-urlencoded");

    // Add params
    HttpParams params = new BasicHttpParams();
    params.setParameter("action", "search");
    params.setParameter("word", "hello");

    post.setParams(params);

    //Execute
    HttpResponse response2 = httpClient.execute(post, localContext);

I need help with figuring out how to get hold of the redirect after I make a post to the server.
First, I need to do a get to obtain some cookies from the server. Then I perform a post with the cookies and additional parameters. The server then answers with a 302 redirect. How do I get the url for that redirect?

Code looks like follows:

HttpGet get = new HttpGet(urlOne);

try {
    //Creating a local instance of cookie store.
    CookieStore cookieJar = new BasicCookieStore();

    // Creating a local HTTP context
    HttpContext localContext = new BasicHttpContext();

    // Bind custom cookie store to the local context
    localContext.setAttribute(ClientContext.COOKIE_STORE, cookieJar);

    HttpResponse response = httpClient.execute(get, localContext);
    HttpEntity entity = response.getEntity();

    System.out.println("------------------GET----------------------");
    System.out.println(response.getStatusLine());
    if (entity != null) {
        System.out.println("Response content length: " + entity.getContentLength());
    }

    // Print out cookies obtained from server
    List<Cookie> cookies = cookieJar.getCookies();
    for (int i = 0; i < cookies.size(); i++) {
        System.out.println("Local cookie: " + cookies.get(i));
    }        

    if (entity != null) {
       entity.consumeContent();
    }
    System.out.println("------------------GET-END---------------------");

    // Create a new post
    HttpPost post = new HttpPost(urlTwo);
    post.setHeader("Content-Type", "application/x-www-form-urlencoded");

    // Add params
    HttpParams params = new BasicHttpParams();
    params.setParameter("action", "search");
    params.setParameter("word", "hello");

    post.setParams(params);

    //Execute
    HttpResponse response2 = httpClient.execute(post, localContext);

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

2024-08-24 04:08:22

我假设您希望自动化浏览器操作并维护会话,以便您也可以访问那些需要维护会话的页面。

我不知道如何通过 org.apache.http.client API 做到这一点。如果您不限于使用 org.apache.http.client API 并且可以使用其他 API,那么您可以使用 HtmlUnit API 否则你可以忽略答案的其余部分。

通过 HtmlUnit 维护会话并自动化浏览器操作可以如下完成:

import com.gargoylesoftware.htmlunit.*;
import com.gargoylesoftware.htmlunit.html.*;

final WebClient webClient = new WebClient();
    try {
        webClient.setJavaScriptEnabled(true);
        webClient.setThrowExceptionOnScriptError(false);
        webClient.setCssEnabled(true);
        webClient.setUseInsecureSSL(true);
        webClient.setRedirectEnabled(true);

        HtmlPage loginPage = webClient.getPage(new URL("https://www.orkut.com/"));
        System.out.println(loginPage.getTitleText());
        List<HtmlForm> forms = loginPage.getForms();
        HtmlForm loginForm = forms.get(0);
        HtmlTextInput username = loginForm.getInputByName("Email");
        HtmlPasswordInput password = loginForm.getInputByName("Passwd");
        HtmlInput submit = loginForm.getInputByName("signIn");
        username.setValueAttribute("username");
        password.setValueAttribute("password");
        HtmlPage homePage = submit.click();.
        Thread.sleep(10 * 1000);
        HtmlPage homePageFrame = (HtmlPage) homePage.getFrameByName("orkutFrame").getEnclosedPage();
        HtmlPage communitiesTestPage = (HtmlPage) webClient.openWindow(new URL("http://www.orkut.co.in/Main#Community?cmm=1"), "CommunitiesWindow").getEnclosedPage();
    }catch(java.security.GeneralSecurityException e) {
        e.printStackTrace();
    }catch(java.io.IOException e) {
        e.printStackTrace();
    }catch(InterruptedException e) {
        e.printStackTrace();
    }

    WebWindow ww = webClient.getWebWindowByName("CommunitiesWindow");
    WebRequestSettings wrs1 = new WebRequestSettings(URL); // URL is the url that requires authentication first

正如您所看到的,上面的代码是如何实现的自动化浏览器操作以及它如何自动维护会话。我们不需要手动处理 cookie 或 URLReDirect...

I am assuming that you want to automate browser operations and maintain session so that you can access those pages too which need session to be maintained.

I don't know how to this through org.apache.http.client API. If you are not restricted to use org.apache.http.client API and can use other API then you can use HtmlUnit API otherwise you can ignore the rest of the answer.

Maintaining sessions and automating browser operations through HtmlUnit can be done as follows:

import com.gargoylesoftware.htmlunit.*;
import com.gargoylesoftware.htmlunit.html.*;

final WebClient webClient = new WebClient();
    try {
        webClient.setJavaScriptEnabled(true);
        webClient.setThrowExceptionOnScriptError(false);
        webClient.setCssEnabled(true);
        webClient.setUseInsecureSSL(true);
        webClient.setRedirectEnabled(true);

        HtmlPage loginPage = webClient.getPage(new URL("https://www.orkut.com/"));
        System.out.println(loginPage.getTitleText());
        List<HtmlForm> forms = loginPage.getForms();
        HtmlForm loginForm = forms.get(0);
        HtmlTextInput username = loginForm.getInputByName("Email");
        HtmlPasswordInput password = loginForm.getInputByName("Passwd");
        HtmlInput submit = loginForm.getInputByName("signIn");
        username.setValueAttribute("username");
        password.setValueAttribute("password");
        HtmlPage homePage = submit.click();.
        Thread.sleep(10 * 1000);
        HtmlPage homePageFrame = (HtmlPage) homePage.getFrameByName("orkutFrame").getEnclosedPage();
        HtmlPage communitiesTestPage = (HtmlPage) webClient.openWindow(new URL("http://www.orkut.co.in/Main#Community?cmm=1"), "CommunitiesWindow").getEnclosedPage();
    }catch(java.security.GeneralSecurityException e) {
        e.printStackTrace();
    }catch(java.io.IOException e) {
        e.printStackTrace();
    }catch(InterruptedException e) {
        e.printStackTrace();
    }

    WebWindow ww = webClient.getWebWindowByName("CommunitiesWindow");
    WebRequestSettings wrs1 = new WebRequestSettings(URL); // URL is the url that requires authentication first

As you can see that how the above code automate browser operations and how it maintains session automatically. We don't need to handle cookies or URLReDirect manually...

不语却知心 2024-08-24 04:08:22

我用Java想到了一个简单的方法。步骤如下:

  1. 创建 HttpUrl 连接。
  2. Set HttpURLConnection.setFollowRedirects( true ); // 默认情况下应为 true 通过
  3. HttpUrlConnection 对象调用 connect;
  4. 连接后,通过 HttpUrlConnection 对象调用 getHeadersFields()
  5. 通过对上述 HttpUrlConnection 对象调用 getUrl() 来获取重定向的 URL;

还有另一种方法可以使用 HTTP 标头中的 Location 字段来获取它,但有时我们无法获取标头中的 Location 字段。至少对我来说没有用。但是上面的方法,肯定是有效的。

There is a simple way I came about in Java. Following are the steps:

  1. Create the HttpUrl connection.
  2. Set HttpURLConnection.setFollowRedirects( true ); // this should be true by default
  3. Call connect over your HttpUrlConnection object;
  4. After connect call the getHeadersFields() over your HttpUrlConnection object;
  5. Get the redirected URL by calling the getUrl() over the above HttpUrlConnection object;

There is also another way of getting it using the Location field in HTTP Headers, but sometimes we do not get the Location field in headers. It did not work for me at least. But the above method, it works for sure.

软甜啾 2024-08-24 04:08:22

It's available in the location header.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文