cxf-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Sergey Beryozkin <sberyoz...@gmail.com>
Subject Re: Consume "application/x-www-form-urlencoded" Content-Type in REST Web Service (cxf:rsServer)
Date Mon, 08 Jul 2013 10:07:57 GMT
Hi

Looks like you post a JSON sequence, but use a form media type, and the 
form provider expects a sequence of name/value pairs.
I guess what you need is still use the JSON provider to read this 
payload. Assuming you can not change the content type at the client side 
(it's a form, etc), then you can try:
- add a _ctype query parameter to a request uri, example: /?_ctype=json
- if on CXF 2.7.x - add pre-match ContainerRequestFilter and update a 
content type there, otherwise register a CXF interceptor and do 
'message.put(Message.CONTENT_TYPE, ""application/json)'

Sergey

On 08/07/13 09:16, dilunika wrote:
> Please provide your kind advice to get me solve following problem
>
> My REST web service services have to provide the support for the
> content-type "application/x-www-form-urlencoded". So, I have developed my
> service as follows.
>
> Contract Definition :
> --------------------------
>> public class PaymentSandboxService {
>>
>>      @POST
>>      @Consumes({"application/json", "application/x-www-form-urlencoded"})
>>      @Produces({"application/json", "application/x-www-form-urlencoded"})
>>      @Path("/2_1/payment/{endUserId}/transactions/amount")
>>      public Response charge(@Body
>>      final AmountTransaction amountTransaction, @PathParam("endUserId")
>>      final String endUserId) throws IOException {
>>
>>          return null;
>>      }
>> }
> Bean Definitions :
> -----------------------
>>      <cxf:rsServer id="rsServer" address="/{{publicAddress}}"
>>          serviceClass="org.jkd.lrn.PaymentSandboxService"
>> loggingFeatureEnabled="true">
>>          <cxf:providers>
>>              <ref bean="jsonProvider" />
>>              <ref bean="formUrlEncodeProvider" />
>>          </cxf:providers>
>>      </cxf:rsServer>
>>      <bean id="jsonProvider"
>> class="org.apache.cxf.jaxrs.provider.JSONProvider">
>>          <property name="marshallAsJaxbElement" value="true" />
>>      </bean>
>>
>>      <bean id="formUrlEncodeProvider"
>> class="org.apache.cxf.jaxrs.provider.FormEncodingProvider" />
>
> When I send a request with Content-Type 'application/json' everything works
> fine. But when a request is sent with the Content-Type
> 'application/x-www-form-urlencoded', request hits the server but it failed
> while converting body to the data type AmountTransaction. Following is a
> part of log I am getting in fuse.log.
>
>> ID: 17
>> Address:
>> http://cnb69:8181/cxf/paymentsandbox/2_1/payment/tel:+916309700000/transactions/amount
>> Encoding: ISO-8859-1
>> Http-Method: POST
>> Content-Type: application/x-www-form-urlencoded
>> Headers: {Accept=[application/json], accept-encoding=[gzip,deflate],
>> Authorization=[Basic a2FzdW5wYXlzYW5kYm94OnBANTV3MHJk],
>> connection=[keep-alive], Content-Length=[670],
>> content-type=[application/x-www-form-urlencoded], Host=[cnb69:8181],
>> User-Agent=[Apache-HttpClient/4.1.1 (java 1.5)]}
>> Payload: {
>>      "amountTransaction": {
>>          "clientCorrelator": "54321",
>>          "endUserId": "tel:+916309700000",
>>          "paymentAmount": {
>>              "chargingInformation": {
>>                  "amount": "10.2662",
>>                  "currency": "USD",
>>                  "description": [
>>                      "Alien Invaders Game"
>>                  ]
>>              },
>>              "chargingMetaData": {
>>                  "onBehalfOf": "Example Games Inc",
>>                  "purchaseCategoryCode": "Game",
>>                  "channel": "SMS",
>>                  "taxAmount": "0"
>>              }
>>          },
>>          "referenceCode": "REF-12345",
>>          "transactionOperationStatus": "CHARGED"
>>      }
>> }
>> --------------------------------------
>> 2013-07-05 13:44:27,477 | WARN  | qtp1316166688-257    |
>> org.apache.cxf.jaxrs.utils.JAXRSUtils | No message body reader has been
>> found for request class AmountTransaction, ContentType :
>> application/x-www-form-urlencoded.
>> 2013-07-05 13:44:27,478 | INFO  | qtp1316166688-257    |
>> org.apache.cxf.interceptor.AbstractLoggingInterceptor | Outbound Message
>> ---------------------------
>> ID: 17
>> Response-Code: 415
>> Content-Type: text/xml
>> Headers: {Date=[Fri, 05 Jul 2013 08:14:27 GMT], Content-Length=[0]}
>> --------------------------------------
>
> What have I done wrong? Is
> "org.apache.cxf.jaxrs.provider.FormEncodingProvider" not the correct
> provider for this case? If so, what is the correct way of implementation?
>
> Thanks,
> Kasun
>
>
>
>
> --
> View this message in context: http://cxf.547215.n5.nabble.com/Consume-application-x-www-form-urlencoded-Content-Type-in-REST-Web-Service-cxf-rsServer-tp5730399.html
> Sent from the cxf-user mailing list archive at Nabble.com.
>


-- 
Sergey Beryozkin

Talend Community Coders
http://coders.talend.com/

Blog: http://sberyozkin.blogspot.com

Mime
View raw message