I have swapped out a route previously using http4 directly for the more
succinct newly released producer DSL.

What was working as:

    from("direct:getCounter")
      .routeId("i4ip-Get-Counter")
      .setHeader("CamelHttpMethod", constant("PUT"))
     
.to("http4://{{counter.service.host}}:{{counter.service.port}}/api/counter/{{counter.name}}")
      .unmarshal().json(JsonLibrary.Jackson,CounterPojo.class)
      .setBody().simple("${body.getCounter()}")
      .convertBodyTo(Integer.class)
      .log(LoggingLevel.INFO, "returned ${body} for counter:
{{counter.name}}")
    ;

I changed to: 

   
restConfiguration().host("{{counter.service.host}}").port("{{counter.service.port}}");

    from("direct:getCounter")
      .routeId("i4ip-Get-Counter")
      *.setHeader("CamelHttpMethod", constant(HttpMethods.PUT))*
      .to("rest:*put*:api/counter/{{counter.name}}")
      .unmarshal().json(JsonLibrary.Jackson,CounterPojo.class)
      .setBody().simple("${body.getCounter()}")
      .convertBodyTo(Integer.class)
      .log(LoggingLevel.INFO, "returned ${body} for counter:
{{counter.name}}")
    ;
  }

I was getting a 404 because the PUT request was being transformed to a POST
since  http4/HttpMethodHelper
<https://github.com/apache/camel/blob/master/components/camel-http4/src/main/java/org/apache/camel/component/http4/helper/HttpMethodHelper.java>
  
turns a request to POST if there is a payload.  My PUT has a payload but it
the method in the URI is ignored.  However you can manually set the header
as above and it works fine.

Not sure whether this is for non http4 libraries.  The example in the camel
source code for the DSL producer is just a GET. 
https://github.com/apache/camel/tree/master/examples/camel-example-rest-producer





--
View this message in context: 
http://camel.465427.n5.nabble.com/2-19-0-Rest-Producer-DSL-http4-support-for-PUT-workaround-tp5799706.html
Sent from the Camel - Users mailing list archive at Nabble.com.

Reply via email to