Отправка HTML-формы в Python и PHP проста, может новичок сделать это в Java? - PullRequest
2 голосов
/ 13 июля 2009

Я сделал две версии скрипта, который отправляет форму веб-страницы (https) и собирает результаты. Одна версия использует Snoopy.class в php, а другая использует urllib и urllib2 в python. Теперь я хотел бы сделать версию Java.

Snoopy делает версию php чрезвычайно простой для написания, и она отлично работает на моей собственной (OS X) машине. Но он выделил слишком много памяти и был убит в тот же момент (во время выполнения curl) при запуске на веб-хостинге pair.com. Отлично работает на сервисе хостинга dreamhost.com.

Поэтому я решил попробовать версию на python, пока я смотрел, что может вызвать проблемы с памятью, а urllib и urllib2 сделали это очень легко. Сценарий работает нормально. Получает около 70000 записей базы данных, используя несколько сотен отправленных форм, сохраняя в файл размером около 10 МБ за 7 минут.

Глядя на то, как сделать это с Java, я чувствую, что это будет не то же самое прогулка в парке, как это было с PHP и Python. Разве подача формы в java не для простых смертных?

Я провел большую часть дня, пытаясь понять, как настроить Apache HttpClient. То есть, прежде чем я сдался. Если мне понадобится больше, чем несколько дней, чтобы разобраться с этим, то, я полагаю, это будет предметом другого вопроса.

HttpClient innov.ch не поддерживает https.

И, похоже, WebClient у меня уйдет как минимум несколько дней, чтобы выяснить.

Итак, версии php и python были на одном дыхании. Можно ли сделать Java-версию в несколько простых строк? Если нет, я оставлю это на более поздний день, так как я только новичок. Если да, то может ли какая-нибудь добрая душа указать мне на свет?

Спасибо.

Для сравнения, основные строки кода из двух версий:


Python версия

import urllib
import urllib2

submitVars['firstName'] = "John"
submitVars['lastName'] = "Doe"
submitUrl = "https URL of form action goes here"
referer = "URL of referring web page goes here"

submitVarsUrlencoded = urllib.urlencode(submitVars)
req = urllib2.Request(submitUrl, submitVarsUrlencoded)
req.add_header('Referer', referer)
response = urllib2.urlopen(req)
thePage = response.read()

php версия

require('Snoopy.class.php');
$snoopy = new Snoopy;

$submit_vars["first_name"] = "John";
$submit_vars["last_name"] = "Doe";
$submit_url = "https URL of form action goes here";
$snoopy->referer = "URL of referring web page goes here"; 

$snoopy->submit($submit_url,$submit_vars);
$the_page = $snoopy->results;

Ответы [ 4 ]

3 голосов
/ 13 июля 2009

Использовать HttpComponents http://hc.apache.org/. Вам нужно:

Пример кода:

import org.apache.http.message.BasicNameValuePair;
import org.apache.http.NameValuePair;
import org.apache.http.HttpResponse;
import org.apache.http.HttpEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.HttpClient;

import java.util.ArrayList;
import java.util.List;
import java.io.OutputStream;
import java.io.ByteArrayOutputStream;

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

        // request parameters
        List<NameValuePair> formparams = new ArrayList<NameValuePair>();
        formparams.add(new BasicNameValuePair("q", "quality"));
        UrlEncodedFormEntity entity = new UrlEncodedFormEntity(formparams, "UTF-8");
        HttpPost httppost = new HttpPost("http://stackoverflow.com/search");
        httppost.setEntity(entity);

        // execute the request
        HttpClient httpclient = new DefaultHttpClient();
        HttpResponse response = httpclient.execute(httppost);

        // display the response status code
        System.out.println(response.getStatusLine().getStatusCode());

        // display the response body
        HttpEntity responseEntity = response.getEntity();
        OutputStream out = new ByteArrayOutputStream();
        responseEntity.writeTo(out);
        System.out.println(out);
    }
}

Сохраните его в HttpClientTest.java. Разместите этот java-файл, httpcore-4.0.1.jar и httpclient-4.0-alpha4.jar в одном каталоге. Предположим, у вас установлен Sun java 1.6 jdk.

javac HttpClientTest.java -cp httpcore-4.0.1.jar;httpclient-4.0-alpha4.jar;commons-logging-1.1.1.jar 

Выполнить это

java HttpClientTest.class -cp httpcore-4.0.1.jar;httpclient-4.0-alpha4.jar;commons-logging-1.1.1.jar 

Я бы сказал, что в Java это так же просто, как в php или python (ваши примеры). Во всех случаях вам нужно:

  • sdk настроен
  • библиотека (с зависимостями)
  • пример кода
2 голосов
/ 20 июля 2009

MercerTraieste и Tarnschaf любезно предложили частичное решение проблемы. Мне потребовалось еще несколько дней и неисчислимые часы мучительного кошмара, прежде чем я перестал пытаться выяснить, как добавить реферер в сообщение http, и отправил новый вопрос в stackoverflow.

Джон Скит сразу ответил, что мне нужно только ...

httppost.addHeader("Referer", referer);

... что заставляет меня выглядеть довольно глупо. Как я это упустил?

Вот результирующий код, почти полностью основанный на предложении MercerTraieste. В моем случае мне нужно было скачать и поместить в мой путь к классам:

HttpComponents

  • HttpClient-4,0-beta2.jar
  • httpcore-4.0.1.jar

Apache Commons

  • Обще-каротаж 1.1.1.jar

import org.apache.http.Header;
import org.apache.http.HeaderElement;
import org.apache.http.HttpRequestInterceptor;
import org.apache.http.HttpRequest;
import org.apache.http.HttpException;
import org.apache.http.NameValuePair;
import org.apache.http.HttpResponse;
import org.apache.http.HttpEntity;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.HttpClient;
import org.apache.http.protocol.HttpContext;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.impl.client.DefaultHttpClient;

import java.util.ArrayList;
import java.util.List;
import java.io.OutputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;

public class HttpClientTest
{
    public static void main(String[] args) throws Exception
    {
        // initialize some variables
        String referer = "URL of referring web page goes here";
        String submitUrl = "https URL of form action goes here";
        List<NameValuePair> formparams = new ArrayList<NameValuePair>();
        formparams.add(new BasicNameValuePair("firstName", "John"));
        formparams.add(new BasicNameValuePair("lastName", "Doe"));

        // set up httppost
        UrlEncodedFormEntity entity = new UrlEncodedFormEntity(formparams, "UTF-8");
        HttpPost httppost = new HttpPost(submitUrl);
        httppost.setEntity(entity);

        // add referer
        httppost.addHeader("Referer", referer);

        // create httpclient
        DefaultHttpClient httpclient = new DefaultHttpClient();

        // execute the request
        HttpResponse response = httpclient.execute(httppost);

        // display the response body
        HttpEntity responseEntity = response.getEntity();
        OutputStream out = new ByteArrayOutputStream();
        responseEntity.writeTo(out);
        System.out.println(out);
    }
}
2 голосов
/ 13 июля 2009

Использование HttpClient, безусловно, является более надежным решением, но это можно сделать без зависимости от внешней библиотеки. См. здесь для примера того, как.

2 голосов
/ 13 июля 2009

Что было бы не так с Apache HttpClient?

Просто убедитесь, что вы добавили зависимости и в classpath, то есть HttpComponents .

PostMethod post = new PostMethod("https URL of form action goes here");
NameValuePair[] data = {
  new NameValuePair("first_name", "joe"),
  new NameValuePair("last_name", "Doe")
};
post.setRequestBody(data);

post.addRequestHeader("Referer", "URL of referring web page goes here");

// TODO: execute method and handle any error responses.
...
InputStream inPage = post.getResponseBodyAsStream();
// handle response.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...