I just did a quick test on camel trunk, you can get the URL parameters by using the
exchange.getIn().getHeader(Exchange.HTTP_QUERY)
When you post the binary data with URI Query.

I just took a look at camel-http and found we could parser the URL parameter for the post method.

So I created a JIRA[1] and will submit a quick fix for it.

[1] https://issues.apache.org/activemq/browse/CAMEL-2386

Willem

Wayne Keenan wrote:
Hi,

Nope, I am POSTing binary data as the body with a content-type of  '
application/octet-stream', and am sending additional parameters in the URI
Query that are not appearing as Camel headers.

Perhaps this is not 'best practice', and the body should be multipart MIME
encoded so it can be POST'ed as application/x-www-form-urlencoded, but AFAIK
what I'm currently doing isn't outlawed by HTTP.

Regards
Wayne

On Thu, Jan 21, 2010 at 12:55 AM, Willem Jiang <[email protected]>wrote:

Hi,

Is your post request using "application/x-www-form-urlencoded" as the
content-type ?
If so , you should get the parameters from the message header.


Willem

Wayne Keenan wrote:

Hi,

I believe I have found the trouble I am having.  I think this bug still
exists in the 2.1.0 release:
http://issues.apache.org/activemq/browse/CAMEL-1806

The docs says from: http://camel.apache.org/jetty.html says:

*Camel also populates all request.parameter and request.headers. For
example, given a client request with the URL,
http://myserver/myserver?orderid=123, the exchange will contain a header
named orderid with the value 123. This feature was introduced in Camel
1.5.*

However, the header parameters are only set for GET, not PUT or POST.

Regards
Wayne


On Wed, Jan 20, 2010 at 4:16 PM, Wayne Keenan <[email protected]
wrote:
 Hi,
Thanks for replying.

On Wed, Jan 20, 2010 at 3:28 PM, Willem Jiang <[email protected]
wrote:
 Hi,
Can you try to set the ID into the message header instead of the message
body ? In this way you can the Request object back :)


       <route>
           <from uri="jetty:http://0.0.0.0:8080/endpoint"/>
           <inOnly uri="seda:sendASync"/>
           <setHeader headerName="id">
                <simple>${id}</simple>
           </setHeader>
       </route>

       <route>
           <from uri="seda:sendASync"/>
           <to uri="bean:myBean"/>
       </route>

You bean's method could
public String controller(@Header("id")String body, Exchange exchange) ;



 The request body contains base64 encoded POST I want.
I can get to the body, url paramters and the ID ok without the
intermediate
SEDA route, in the bean I have:



     HttpServletRequest req =
exchange.getIn().getBody(HttpServletRequest.class);

     def corrId = exchange.getIn().getMessageId()

I also can get to the URL (not form encoded) parameters   (e.g. the URL
is:
http://0.0.0.0:65503/endpoint?myParam=value) by using:

     def p1 = req?.getParameter('myParam')



It's ony when I introduce the SEDA that the HttpServletRequest no longer
exists,  (I think), and I am unable to obtain the HTTP parameters from
the
URL

Perhaps I should be copying the HTTP parameters to Camel message
properties?  That way my bean can be less dependent on the HTTP protocol.

Is that something someone would be able to give me an example of please?
Is there a built-in way to auto populate Camel message properties with
HTTP
properties

Alternatively, sticking with HTTP aware bean,I just get null using:

println exchange.getProperty(Exchange.HTTP_QUERY)
or
println exchange.getIn().getProperty(Exchange.HTTP_QUERY)



Regards
Wayne



 Willem

Wayne Keenan wrote:

 Hi,
Apologies, I didn't word my previous email very well; what I should
have
also mentioned for clarity is that if I do this:

      <route>
          <from uri="jetty:http://0.0.0.0:8080/endpoint"/>
          <to uri="bean:myBean"/>
          <transform>
              <simple>${id}</simple>
          </transform>
      </route>

The same bean is able to obtain the HTTPServletRequest to get the POST
data
(base64 encoded binary) andthe URL parameters,  however,  if I
introduce
the
SEDA
call the same bean can't get the HTTPServletRequest. The salient bean
code
is:

 public String controller(String body, Exchange exchange) {

  try {
    HttpServletRequest req =
exchange.getIn().getBody(HttpServletRequest.class);


Regards
Wayne

On Wed, Jan 20, 2010 at 9:02 AM, Wayne Keenan <[email protected]

wrote:

 Hi,

I have a Jetty endpoint that when recieving a message will perform the
processing asynchronously and syncronously return a correlationId so
the
client can come back later to another endpoint to see how processsing
is
going.

I found an example on the mailing list of how to pass the HttpSession
object using Java, but I can't seem to find out how
to reference or pass the HttpRequest using SpringDSL.  What I have at
the
moment is:


      <route>
          <from uri="jetty:http://0.0.0.0:8080/endpoint"/>
          <inOnly uri="seda:sendASync"/>
          <transform>
              <simple>${id}</simple>
          </transform>
      </route>

      <route>
          <from uri="seda:sendASync"/>
          <to uri="bean:myBean"/>
      </route>

Is there a way to say 'pass the HTTP stuff through please Mr SEDA'?
Should I really be setting a header property to that of a HTTP Object?
 How
do I obtain it?
Should I architect this differently?

All the best,
Wayne





Reply via email to