Requête HTTP à l'aide de Netty
Je viens de commencer netty et je suis vraiment déçu de la documentation présente sur
leur site web.
Je suis en train d'essayer de vous connecter à une URL à l'aide de Netty.. j'ai pris le temps de client exemple à partir de leur site web et il a changé comme par mon exigence..
Code :
public class NettyClient {
public static void main(String[] args) throws Exception {
String host = "myUrl.com/v1/parma?param1=value";
int port = 443;
EventLoopGroup workerGroup = new NioEventLoopGroup();
try {
Bootstrap b = new Bootstrap();
b.group(workerGroup);
b.channel(NioSocketChannel.class);
b.option(ChannelOption.SO_KEEPALIVE, true);
b.handler(new ChannelInitializer<SocketChannel>() {
@Override
public void initChannel(SocketChannel ch) throws Exception {
ch.pipeline().addLast(new ClientHandler());
ch.pipeline().addLast("encoder", new HttpRequestEncoder());
}
});
//Start the client.
ChannelFuture f = b.connect(host, port).sync();
//Wait until the connection is closed.
f.channel().closeFuture().sync();
} finally {
workerGroup.shutdownGracefully();
}
}
}
Mais le problème est qu'il s'attend à ce que l'url sans les paramètres de la requête.. Comment puis-je passer les paramètres de la requête avec l'URL?
et s'il vous plaît me donner un lien d'une bonne documentation pour Netty 4..
MODIFIER
Code Client après avoir cité l'exemple mentionné dans la réponse :
URI uri = new URI("myUrl.com/v1/parma?param1=value");
String scheme = uri.getScheme() == null? "http" : uri.getScheme();
String host = "myUrl.com";
int port = 443;
boolean ssl = "https".equalsIgnoreCase(scheme);
//Configure the client.
EventLoopGroup group = new NioEventLoopGroup();
try {
Bootstrap b = new Bootstrap();
b.group(group)
.channel(NioSocketChannel.class)
.handler(new NettyClientInitializer(ssl));
//Make the connection attempt.
Channel ch = b.connect(host, port).sync().channel();
//Prepare the HTTP request.
HttpRequest request = new DefaultHttpRequest(
HttpVersion.HTTP_1_1, HttpMethod.GET, uri.getRawPath());
request.headers().set(HttpHeaders.Names.HOST, host);
request.headers().set(HttpHeaders.Names.CONNECTION, HttpHeaders.Values.CLOSE);
//request.headers().set(HttpHeaders.Names.ACCEPT_ENCODING, HttpHeaders.Values.GZIP);
/*//Set some example cookies.
request.headers().set(
HttpHeaders.Names.COOKIE,
ClientCookieEncoder.encode(
new DefaultCookie("my-cookie", "foo"),
new DefaultCookie("another-cookie", "bar")));
*/
//Send the HTTP request.
ch.writeAndFlush(request);
//Wait for the server to close the connection.
ch.closeFuture().sync();
} finally {
//Shut down executor threads to exit.
group.shutdownGracefully();
}
code du gestionnaire :
public class ClientHandler extends SimpleChannelInboundHandler<HttpObject> {
@Override
public void channelRead0(ChannelHandlerContext ctx, HttpObject msg) throws Exception {
if (msg instanceof HttpResponse) {
HttpResponse response = (HttpResponse) msg;
System.out.println("STATUS: " + response.getStatus());
System.out.println("VERSION: " + response.getProtocolVersion());
System.out.println();
if (!response.headers().isEmpty()) {
for (String name: response.headers().names()) {
for (String value: response.headers().getAll(name)) {
System.out.println("HEADER: " + name + " = " + value);
}
}
System.out.println();
}
if (HttpHeaders.isTransferEncodingChunked(response)) {
System.out.println("CHUNKED CONTENT {");
} else {
System.out.println("CONTENT {");
}
}
if (msg instanceof HttpContent) {
HttpContent content = (HttpContent) msg;
System.out.print(content.content().toString(CharsetUtil.UTF_8));
System.out.flush();
if (content instanceof LastHttpContent) {
System.out.println("} END OF CONTENT");
}
}
}
@Override
public void exceptionCaught(
ChannelHandlerContext ctx, Throwable cause) throws Exception {
cause.printStackTrace();
ctx.close();
}
}
initialiseur de code :
public class NettyClientInitializer extends ChannelInitializer<SocketChannel> {
private final boolean ssl;
public NettyClientInitializer(boolean ssl) {
this.ssl = ssl;
}
@Override
public void initChannel(SocketChannel ch) throws Exception {
//Create a default pipeline implementation.
ChannelPipeline p = ch.pipeline();
p.addLast("log", new LoggingHandler(LogLevel.INFO));
//Enable HTTPS if necessary.
/*
if (ssl) {
SSLEngine engine =
SecureChatSslContextFactory.getClientContext().createSSLEngine();
engine.setUseClientMode(true);
p.addLast("ssl", new SslHandler(engine));
}
*/
p.addLast("codec", new HttpClientCodec());
//Remove the following line if you don't want automatic content decompression.
//p.addLast("inflater", new HttpContentDecompressor());
//Uncomment the following line if you don't want to handle HttpChunks.
p.addLast("aggregator", new HttpObjectAggregator(1048576));
p.addLast("handler", new ClientHandler());
}
}
OriginalL'auteur Mitaksh Gupta | 2013-11-18
Vous devez vous connecter pour publier un commentaire.
Votre code ne gère que le faible niveau de la connexion en ce moment. En effet, à ce niveau, seul le nom d'hôte et le port peut être utilisé.
La requête HTTP que Vous avez à construire une
HttpRequest
objet et l'envoyer sur le canal. Dans cette demande, objet de définir les paramètres de la requête et de toutes ces choses.Il ya un tas d'exemple de code sur le client HTTP fonctionnalité sur Netty site web - ont un coup d'oeil!
ont mis à jour la question avec le code mis à jour.. s'il vous plaît jeter un oeil..
Quel est le problème maintenant? Les messages d'erreur?
Je crois que le problème c'est que j'ai besoin d'envoyer les paramètres de la requête ainsi que l'url à l'aide de la méthode GET.. mais il ne reçoit pas que... l'url nous envoyons de l'uri.rawpath()
Dans le code que Vous avez posté, il n'y a pas de lignes de code, que la production de la réponse. Il vous suffit d'envoyer la demande, fermer la connexion et c'est tout. Vous avez besoin d'ajouter un peu de code pour gérer la réponse aussi. Avoir un autre regard sur la netty un exemple de code, il y a une classe de Gestionnaire aussi pour l'impression de la réponse.
OriginalL'auteur Tarmo R
Dans cet exemple, le problème réside avec le constructeur de la DefaultHttpRequest paramètre d'uri.getRawPath(). L'invocation de cette méthode ne retourne PAS les paramètres de la requête. Il fonctionne dans ce cas, comme il n'y avait pas de paramètres de requête dans le Snoop exemple. Par la substitution d'uri.toASCIIString() retourne l'uri codé complet avec les paramètres de la requête. Pour le prouver à vous-même, plutôt que d'avoir une invocation de méthode à l'intérieur d'une invocation de méthode (une mauvaise idée justement pour cette raison, ajoute la déclaration
et de regarder la chaîne url.
J'ai eu exactement le même problème. Je l'ai fait en mode natif dans les servlets depuis des années, mais maintenant est d'essayer de le faire dans un Netty app.
Par conséquent, le nouveau code serait:
OriginalL'auteur Walt Corey
Lorsque vous générez la demande, vous devez ajouter de la requête pour le chemin d'accès. Au lieu de
utilisation
OriginalL'auteur MrBigglesworth