Автоматизируйте отправку HTML-форм с помощью Java, чтобы найти продуктовые часы - PullRequest
1 голос
/ 11 июля 2011

Я пытаюсь автоматизировать отправку формы, используя Java, чтобы получить часы работы продуктового магазина здесь:

www.giantfood.com

Я разместил запрос и скрытые мили и поля storeType формы, но мой output.html - это просто исходный веб-заголовок и нижний колонтитул с сообщением об ошибке в теле. Что я делаю не так?

import java.io.*;
import java.net.*;

public class PostHTML
{
  public static void main(String[] args)
  {
    try
    {
      URL url = new URL( "http://www.giantfood.com/our_stores/locator/store_search.htm" );

      HttpURLConnection hConnection = (HttpURLConnection)
                             url.openConnection();
      HttpURLConnection.setFollowRedirects( true );

      hConnection.setDoOutput( true );
      hConnection.setRequestMethod("POST"); 

      PrintStream ps = new PrintStream( hConnection.getOutputStream() );
      ps.print("groceryStoreAddress=20814&groceryStoreMiles=10&storeType=GROCERY");
      ps.close();

      hConnection.connect();

      if( HttpURLConnection.HTTP_OK == hConnection.getResponseCode() )
      {
        InputStream is = hConnection.getInputStream();
        OutputStream os = new FileOutputStream("output.html");
        int data;
        while((data=is.read()) != -1)
        {
          os.write(data);
        }
        is.close();
        os.close();
        hConnection.disconnect();
      }
    }
    catch(Exception ex)
    {
      ex.printStackTrace();
    }
  }
}

UPDATE

Спасибо! Использование & сработало. Я пытаюсь использовать HttpClient, но сейчас получаю еще одну ошибку:

package clientwithresponsehandler;

import org.apache.http.client.ResponseHandler;
import org.apache.http.client.HttpClient;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.DefaultHttpClient;

import java.util.ArrayList;
import java.util.List;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;

/**
 * This example demonstrates the use of the {@link ResponseHandler} to simplify
 * the process of processing the HTTP response and releasing associated resources.
 */
public class ClientWithResponseHandler {

    public static void main(String[] args) throws Exception {

        HttpClient httpclient = new DefaultHttpClient();
        try {
            HttpPost httpost = new HttpPost("http://www.giantfood.com/our_stores/locator/store_search.htm");

            System.out.println("executing request " + httpost.getURI());

            List <NameValuePair> nvps = new ArrayList <NameValuePair>();
            nvps.add(new BasicNameValuePair("groceryStoreAddress", "20878"));
            nvps.add(new BasicNameValuePair("groceryStoreMiles", "10"));
            nvps.add(new BasicNameValuePair("storeType", "GROCERY"));

            httpost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));

            // Create a response handler
            ResponseHandler<String> responseHandler = new BasicResponseHandler();
            String responseBody = httpclient.execute(httpost, responseHandler);
            System.out.println("----------------------------------------");
            System.out.println(responseBody);
            System.out.println("----------------------------------------");
        } finally {
            // When HttpClient instance is no longer needed,
            // shut down the connection manager to ensure
            // immediate deallocation of all system resources
            httpclient.getConnectionManager().shutdown();
        }
    }
}

Выход:

пробег: выполнение запроса http://www.giantfood.com/our_stores/locator/store_search.htm Исключение в потоке "main" org.apache.http.client.HttpResponseException: временно перемещено в org.apache.http.impl.client.BasicResponseHandler.handleResponse (BasicResponseHandler.java:67) в org.apache.http.impl.client.BasicResponseHandler.handleResponse (BasicResponseHandler.java:55) в org.apache.http.impl.client.AbstractHttpClient.execute (AbstractHttpClient.java:945) в org.apache.http.impl.client.AbstractHttpClient.execute (AbstractHttpClient.java:919) в org.apache.http.impl.client.AbstractHttpClient.execute (AbstractHttpClient.java:910) at clientwithresponse handler.ClientWithResponseHandler.main (ClientWithResponseHandler.java:39) Java Результат: 1 СТРОИТЬ УСПЕШНО (общее время: 1 секунда)

Мне не понятна ошибка "Перемещено временно".

Ответы [ 2 ]

2 голосов
/ 11 июля 2011

попробуйте использовать

ps.print("groceryStoreAddress=20814&groceryStoreMiles=10&storeType=GROCERY")

вместо

Кстати, проще использовать http-библиотеку, например Apache HttpClient

0 голосов
/ 14 июля 2011

Временно решили перемещенное, узнав о перенаправлениях HTML:

Httpclient 4, ошибка 302. Как перенаправить?

...