python ve php html form gönderme basit bir acemi java yapabilirim?

4 Cevap java

Ben (https) web sayfası formu gönderir ve sonuçlarını toplayan bir komut dosyası iki versiyonu yaptık. Bir sürüm php Snoopy.class kullanır ve diğer python urllib ve urllib2 kullanır. Şimdi ben bir java versiyonunu yapmak istiyorum.

Snoopy yazmak için php sürüm derece kolay hale getirir, ve bu benim kendi (OS X) makinede iyi çalışır. Pair.com web hosting hizmeti çalıştırdığınızda Ama, çok fazla bellek tahsis ve (kıvırmak yürütme sırasında) aynı noktada öldürüldü. Dreamhost.com web barındırma hizmeti iyi çalışır.

Yani bellek sorunu neden olabilir ne içine bakarken ben bir python sürümünü denemeye karar verdi ve urllib ve urllib2 bu çok kolay. Senaryo iyi çalışır. Yaklaşık 7 dakika içinde, yaklaşık 10MB bir dosyaya kaydetme, birkaç yüz formu gönderimler kullanarak, yaklaşık 70.000 veritabanı kayıtları alır.

Java ile bunu nasıl içine bakıyor, ben o olmayacak duygu olsun aynı walk-in-the-park o php ve python ile olduğu gibi. Java değil ölümlüler için form gönderme mi?

Ben sadece Apache HTTPClient kurmak için nasıl anlamaya çalışıyorum günün en geçirdim. Ben vazgeçtim önce olmasıdır. O dışarı sıralamak için daha fazla bir kaç gün daha beni alırsa, o zaman başka bir soru tabi olacaktır, sanırım.

HttpClient innovation.ch https desteklemiyor.

Bunu anlamaya en azından bir kaç gün beni alacak gibi ve WebClient görünüyor.

Yani, php ve python sürümleri bir esinti vardı. Bir java sürümü de birkaç basit çizgileri yapılabilir? Değilse Ben sadece bir acemi olduğum için, ben bir sonraki gün için bırakacağım. Eğer öyleyse, bir çeşit ruh ışığa doğru bana gelin misiniz?

Teşekkürler.

Karşılaştırma için, iki sürümlerinden kod temel hatları:


python sürümü

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 versiyonu

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 Cevap

MercerTraieste ve Tarnschaf nazik soruna kısmi çözümler sundu. Daha bir kaç gün sürdü ve beyin-yarma kabus anlatılmamış saat, ben http yazılan bir referer eklemek nasıl anlamaya çalışıyorum vazgeçti önce ve StackOverflow yeni bir soru gönderdi.

Jon Skeet Ben sadece gerekli olduğunu anında yanıtladı ...

httppost.addHeader("Referer", referer);

... Hangi beni oldukça aptal görünmesini sağlar. Nasıl ki bir görmezden mi?

İşte MercerTraieste önerisine neredeyse tamamen dayalı çıkan kodudur. Benim durumumda, ben indirmek ve benim sınıf yerleştirmek için gerekli:

HttpComponents

  • HttpClient-4.0-beta2.jar
  • httpcore-4.0.1.jar

Apache Commons

  • Commons-günlük-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);
    }
}

HttpComponents kullanın http://hc.apache.org/. İhtiyacınız olanlar:

Örnek kod:

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 kaydedin. Eğer yüklü güneş java 1.6 jdk var düşünürsek aynı dizinde bu java dosyayı, httpcore-4.0.1.jar ve HttpClient-4.0-alpha4.jar var, derlemek:

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

Gerçekleştirmek

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

Ben php ya da Python gibi bu (sizin örnekler) java gibi basit olduğunu iddia ediyorum. Her durumda ihtiyacınız:

  • yapılandırılmış sdk
  • (bağımlılıkları ile) bir kütüphane
  • örnek kod

Ne Apache HTTPClient kadar yanlış olur?

Sadece sınıf için de bağımlılıkları eklemek emin olun, yani 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.

HttpClient kullanarak kesinlikle daha sağlam bir çözüm, ancak bu bir dış kitaplık bağımlılık olmadan yapılabilir. here nasıl bir örnek için bkz.