What I've seen with AHC is that the configuration is often the most
challenging aspect.  One metaphor I used is that HttpClient is more like a
browser.  Things like keep-alive, user-agent, accept-encoding, etc. normally
belong to the browser and not at the individual request level.  I'm sure
there are many delicate decisions to make that don't get solved easily by
this metaphor, but I think it's certainly useful.

I've mentioned this before, but one thing I like with AHC is handling
multiple requests with a completion queue (not unlike CompletionService).
This addresses a use case which is a variation of one of Mike's use cases.

Suppose you want to send requests to N URLs concurrently.  You want to limit
the overall duration to a certain time, and you want to place a standard
error result for the URL for which the response did not get in time.  This
is a pretty typical situation with a "scatter-and-gather" scenario (e.g.
portal with multiple server-side content aggregation, etc.).

With a completion queue, one can do things like the following:

CompletionQueue q;
client.send(request1, q);
client.send(request2, q);
...
client.send(requestN, q);

for (int i = 0; i < N; i++) {
    Future f = q.take();
    Response r = f.get();
}

This can be done by the user in terms of a listener/callback, but it would
certainly be nice to provide support for this...  My 2 cents.

Thanks,
Sangjin


On Feb 12, 2008 10:53 AM, Mike Heath <[EMAIL PROTECTED]> wrote:

> Rick McGuire wrote:
> > Mike Heath wrote:
> >> Rick McGuire wrote:
> >>
> >>> The one feature I like about the AHC client that appears to be missing
> >>> here is the higher-level abstraction of an HTTP request.  The one
> >>> drawback of doing everything with URLs is the requirement that the
> user
> >>> of the client needs to be responsible for encoding all of the
> parameter
> >>> information in the URL.  In the AHC approach, a request is configured
> as
> >>> an operation to a particular address and additional specifics of the
> >>> operation are attached to the request (parameters, credentials needed
> >>> for authentication, proxy configuration etc.).  The AHC client then
> uses
> >>> that information to handle the URL encoding, authentication
> challenges,
> >>> proxy connection, etc.  There are times where a straighforward "fetch
> me
> >>> this URL mode" is sufficient.  There are other situations where that
> >>> becomes awkward to use.
> >>>
> >>
> >> Thanks for the feedback Rick.  That's one of the issues I've been going
> >> back and forth on.  In the HttpConnection interface, you have no choice
> >> but to build and send an HttpRequest manually.  So you have some
> >> flexibility there.  I've been debating whether or not to put support
> for
> >> sending a raw HttpRequest in the 'simplified' HttpClient.  I've been
> >> leaning toward add that functionality to the HttpClient your reply is
> >> making me lean even further in that direction.
> >>
> >> -Mike
> >>
> > Yes, it is a bit of a balancing act.  After a certain point, it becomes
> > difficult to continue adding all of the possibilities to the method
> > signatures.  I think a good balance point is to support having a request
> > object that's got all of the bells and whistles and a few methods that
> > handle the most typical use scenarios (but in the end, are just creating
> > the same type of request object on the caller's behalf).
> > Rick
>
> Yes I totally agree.  A lot of the methods I put in HttpClient were
> brainstorming ideas.  I was trying to support the most common cases as
> well as some of the more complex cases (like doing a PUT with a file,
> for example.)
>
> We need to find a balance of simplicity and function and I'm not sure
> where that point is at.  Some of the issues that need to be addressed
> with supporting sending raw HttpRequest objects using the HttpClient
> (the way I've modeled it, that is) are:
>  - If the HttpClient has connection pooling enabled but a request is
> sent without KeepAlive and Connection headers, do we automatically
> change the request to turn keepAlive on and use connection pooling or do
> we create a new connection?
>  - If the HttpClient has a cookie manager, do we automatically add
> cookies to a manually created HttpRequest?
>  - Are there other headers that we would want to automatically populate
> if their absent (User-Agent, Accept*, etc.) ?
>  - Do we even want to modify a manually created HttpRequest?  Should
> this be configurable?  If so how?
>
> I don't have answers to these questions which is why I decided to just
> put support for sending raw HttpRequest messages in the HttpConnection
> interface because that's the interface I intended to make available for
> complex use cases (COMET, dealing with large data streams, etc.)
> However, I think we need to find some middle ground.  I'm just not sure
> where that middle ground is.
>
> Thanks again for your feedback, Rick.
>
> -Mike
>
> >
> >
> >>
> >>
> >>
> >>> Rick
> >>>
> >>> Mike Heath wrote:
> >>>
> >>>> I posted some use cases here:
> >>>> http://cwiki.apache.org/confluence/display/AWEB/ClientUseCases  They
> >>>> still need some refinement to properly convey what I want but they're
> a
> >>>> decent start.
> >>>>
> >>>> I've also posted a hypothetical AsyncWeb Client API at
> >>>> http://swamp.homelinux.net/mina/asyncweb/client/api/ with the intent
> to
> >>>> further promote discussion and foster more innovative ideas.  I would
> >>>> love to here some feedback on this API.  What do you like, dislike,
> not
> >>>> understand?  Where do you see room for improvement?  The API is
> really
> >>>> rough in places but for the most part it conveys the ideas I've had
> >>>> over
> >>>> the past week or so.  Any suggestions for name changes to classes
> >>>> and/or
> >>>> methods are welcome.
> >>>>
> >>>> -Mike
> >>>>
> >>>>
> >>>
> >>
> >>
> >>
> >
> >
>
>

Reply via email to