Pagina 1 di 1
[JAVA] Libreria HTTP
Inviato: sabato 13 settembre 2008, 10:23
da Zoff
Salve,
qualcuno conosce una libreria, possibilmente open&free, che implementi le chiamate get/post di HTTP in java e supporti anche l'utilizzo dei cookies senza ulteriori modifiche?
Aspetto ansioso...
ciauz
Re: [JAVA] Libreria HTTP
Inviato: sabato 13 settembre 2008, 11:33
da daemon_nio
cosa devi fare esattamente?
io per un mio progettino ho usato queste classe:
Codice: Seleziona tutto
import javax.annotation.Resource;
import javax.xml.transform.Source;
import javax.xml.ws.Endpoint;
import javax.xml.ws.Provider;
import javax.xml.ws.ServiceMode;
import javax.xml.ws.WebServiceContext;
import javax.xml.ws.WebServiceProvider;
import javax.xml.ws.handler.MessageContext;
import javax.xml.ws.http.HTTPBinding;
fanno parte del core J2EE e ti consentono addirittura di creare un server
ino stile apache tomcat.
Io l'ho utilizzato per creare un'applicazione stile
REST, quindi elaborare richieste HTTP e processarle stile
servlet implementando i metodi
doGet,
doPost,
doHead,
doDelete e
doPut.
Ma credo che se ti guardi un po' le sintassi le stesse classi possono essere utilizzate anche per creare dei piccoli client.
Per i cookie sempre nel core J2EE dovresti trovare la classe:
Re: [JAVA] Libreria HTTP
Inviato: sabato 13 settembre 2008, 14:40
da Zoff
daemon_nio ha scritto:
cosa devi fare esattamente?
io per un mio progettino ho usato queste classe:
Codice: Seleziona tutto
import javax.annotation.Resource;
import javax.xml.transform.Source;
import javax.xml.ws.Endpoint;
import javax.xml.ws.Provider;
import javax.xml.ws.ServiceMode;
import javax.xml.ws.WebServiceContext;
import javax.xml.ws.WebServiceProvider;
import javax.xml.ws.handler.MessageContext;
import javax.xml.ws.http.HTTPBinding;
fanno parte del core J2EE e ti consentono addirittura di creare un server
ino stile apache tomcat.
Io l'ho utilizzato per creare un'applicazione stile
REST, quindi elaborare richieste HTTP e processarle stile
servlet implementando i metodi
doGet,
doPost,
doHead,
doDelete e
doPut.
Ma credo che se ti guardi un po' le sintassi le stesse classi possono essere utilizzate anche per creare dei piccoli client.
Per i cookie sempre nel core J2EE dovresti trovare la classe:
Grazie per l'info ma cercavo qualcosa di già fatto...
Tipo un oggetto su cui devo semplicemente chiamare get() e post() e nient'altro... Tenendomi così "all'oscuro" di cookies e quant'altro...
ciauz
Re: [JAVA] Libreria HTTP
Inviato: sabato 13 settembre 2008, 19:24
da IppatsuMan
Re: [JAVA] Libreria HTTP
Inviato: domenica 14 settembre 2008, 13:25
da Zoff
Molto interessante... Hai mica per caso degli esempi sull'utilizzo dei cookies?
O addirittura qualcuno che ha creato un HTTPClient che emuli firefox o un altro browser?
ciauz
Re: [JAVA] Libreria HTTP
Inviato: domenica 14 settembre 2008, 15:37
da Massimo S.
Io pure ho sempre usato HttpComponents di Apache, o meglio io ho usato la versione vecchia commons-http-client 2.x
Però non ho dovuto mai avere a che fare con la gestione dei cookies.
Zoff che intendi per emulare Firefox o altro browser?
HttpComponents rispetta le RFC sul protocollo HTTP ed è in grado di gestire (lato client) tutti i vari metodi http: get, post, ecc.. e supporta tutto quello che prevede il protocollo http 1.1
Se intendi che si deve fingere Firefox, credo che non lo faccia, nell'header delle richieste http la libreria dichiara di essere quella che è, Apache HttpComponents, non so se c'è un modo per far si che dica di essere Firefox o altro browser.
Inoltre HttpComponents gestisce solo la parte di "comunicazione" di un browser, ovvero le richieste/risposte http, ma non è in grado di fare cose come "renderizzare" le pagine html o far girare javascript
Re: [JAVA] Libreria HTTP
Inviato: domenica 14 settembre 2008, 18:50
da Zoff
Massimo S. ha scritto:
Io pure ho sempre usato HttpComponents di Apache, o meglio io ho usato la versione vecchia commons-http-client 2.x
Però non ho dovuto mai avere a che fare con la gestione dei cookies.
Zoff che intendi per emulare Firefox o altro browser?
HttpComponents rispetta le RFC sul protocollo HTTP ed è in grado di gestire (lato client) tutti i vari metodi http: get, post, ecc.. e supporta tutto quello che prevede il protocollo http 1.1
Se intendi che si deve fingere Firefox, credo che non lo faccia, nell'header delle richieste http la libreria dichiara di essere quella che è, Apache HttpComponents, non so se c'è un modo per far si che dica di essere Firefox o altro browser.
Inoltre HttpComponents gestisce solo la parte di "comunicazione" di un browser, ovvero le richieste/risposte http, ma non è in grado di fare cose come "renderizzare" le pagine html o far girare javascript
Si si non intendevo assolutamente renderizzare le pagine...
Il mio interesse all'emulazione di Firefox/IE/Opera/Chrome/etc riguardava proprio come si presenta la libreria ai server...
Ho notato tra i parametri di connessione (come è ovvio) UserAgent ed in particolare il metodo HttpProtocalParams.setUserAgent(params,"stringa userAgent") che però negli esempi che ho trovato setta a: "HttpComponents/1.1"
Magari di li si combina qualcosa...
Il problema principale però è che ho provato questo esempio:
Codice: Seleziona tutto
/*
* $HeadURL: http://svn.apache.org/repos/asf/httpcomponents/httpcore/tags/4.0-beta2/module-main/src/examples/org/apache/http/examples/ElementalHttpGet.java $
* $Revision: 610464 $
* $Date: 2008-01-09 18:10:55 +0100 (Wed, 09 Jan 2008) $
*
* ====================================================================
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*
*/
package org.apache.http.examples;
import java.net.Socket;
import org.apache.http.ConnectionReuseStrategy;
import org.apache.http.HttpHost;
import org.apache.http.HttpResponse;
import org.apache.http.HttpVersion;
import org.apache.http.impl.DefaultConnectionReuseStrategy;
import org.apache.http.impl.DefaultHttpClientConnection;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.message.BasicHttpRequest;
import org.apache.http.params.HttpParams;
import org.apache.http.params.HttpProtocolParams;
import org.apache.http.protocol.BasicHttpProcessor;
import org.apache.http.protocol.HttpContext;
import org.apache.http.protocol.BasicHttpContext;
import org.apache.http.protocol.ExecutionContext;
import org.apache.http.protocol.HttpRequestExecutor;
import org.apache.http.protocol.RequestConnControl;
import org.apache.http.protocol.RequestContent;
import org.apache.http.protocol.RequestExpectContinue;
import org.apache.http.protocol.RequestTargetHost;
import org.apache.http.protocol.RequestUserAgent;
import org.apache.http.util.EntityUtils;
/**
* Elemental example for executing a GET request.
*
* @author <a href="mailto:oleg at ural.ru">Oleg Kalnichevski</a>
*
*
* <!-- empty lines above to avoid 'svn diff' context problems -->
* @version $Revision: 610464 $
*/
public class ElementalHttpGet {
public static void main(String[] args) throws Exception {
HttpParams params = new BasicHttpParams();
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(params, "UTF-8");
HttpProtocolParams.setUserAgent(params, "HttpComponents/1.1");
HttpProtocolParams.setUseExpectContinue(params, true);
BasicHttpProcessor httpproc = new BasicHttpProcessor();
// Required protocol interceptors
httpproc.addInterceptor(new RequestContent());
httpproc.addInterceptor(new RequestTargetHost());
// Recommended protocol interceptors
httpproc.addInterceptor(new RequestConnControl());
httpproc.addInterceptor(new RequestUserAgent());
httpproc.addInterceptor(new RequestExpectContinue());
HttpRequestExecutor httpexecutor = new HttpRequestExecutor();
HttpContext context = new BasicHttpContext(null);
HttpHost host = new HttpHost("localhost", 8080);
DefaultHttpClientConnection conn = new DefaultHttpClientConnection();
ConnectionReuseStrategy connStrategy = new DefaultConnectionReuseStrategy();
context.setAttribute(ExecutionContext.HTTP_CONNECTION, conn);
context.setAttribute(ExecutionContext.HTTP_TARGET_HOST, host);
try {
String[] targets = {
"/",
"/"};
for (int i = 0; i < targets.length; i++) {
if (!conn.isOpen()) {
Socket socket = new Socket(host.getHostName(), host.getPort());
conn.bind(socket, params);
}
BasicHttpRequest request = new BasicHttpRequest("GET", targets[i]);
System.out.println(">> Request URI: " + request.getRequestLine().getUri());
context.setAttribute(ExecutionContext.HTTP_REQUEST, request);
request.setParams(params);
httpexecutor.preProcess(request, httpproc, context);
HttpResponse response = httpexecutor.execute(request, conn, context);
httpexecutor.postProcess(response, httpproc, context);
System.out.println("<< Response: " + response.getStatusLine());
System.out.println(EntityUtils.toString(response.getEntity()));
System.out.println("==============");
if (!connStrategy.keepAlive(response, context)) {
conn.close();
} else {
System.out.println("Connection kept alive...");
}
}
} finally {
conn.close();
}
}
}
E su localhost ho messo il seguente file index.php:
Codice: Seleziona tutto
<?php
session_start();
if($_SESSION['test']==""){
$_SESSION['test'] = "funziona!";
}else{
echo "test vale: ".$_SESSION['test'];
}
?>
Il codice sopra così modificato da me esegue 2 richieste get a index.php, se supportasse i cookies la prima dovrebbe settare la variabile di sessione e la seconda dovrebbe stamparla (testato e funzionante con firefox) ma in entrambe le chiamate risponde con una pagina vuota...
Allora ho provato
quest'altro esempio trovato sul sito.
E adesso funziona...
Comincio a studiarmi bene come usarlo...
Re: [JAVA] Libreria HTTP
Inviato: martedì 16 settembre 2008, 0:00
da Massimo S.
Come dicevo nell'altro post io ho usato la vecchia versione common-http-client 2.x
Vedendo gli esempi che hai postato, devo dire che la libreria mi sembra molto cambiata, comunque il codice del secondo esempio (quello di cui hai postato solo il link e per cui ti funziona le gestione dei cookies) mi sembra più simile al codice che usavo per richiamare la vecchia libreria.
Forse il primo esempio è qualcosa che va più a "basso livello" di quanto effettivamente ti serva