簡體   English   中英

在REST Web服務中遇到Content-Type“應用程序/ x-www-form-urlencoded”的困擾

[英]Struggled with Content-Type “application/x-www-form-urlencoded” in REST webservices

在此先感謝您提供有關CXF REST提供程序所面臨的以下問題的建議。

我已經使用Apache CXF開發了REST Web服務服務器。 以下是合同的定義。 請注意,這是在Camel上下文中使用的。

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定義:

    <cxf:rsServer id="rsServer" address="/{{publicAddress}}"  serviceClass="a.b.cPaymentSandboxService"
        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" />

當我使用Content-Type'application / json'發送請求時,一切正常。 但是,當使用內容類型“ application / x-www-form-urlencoded”發送請求時,請求會到達服務器,但在將正文轉換為所需數據類型時失敗。 以下是我進入Fuse esb日志的日志部分。

日志的一部分:

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]}
--------------------------------------

該部分的副本(來自Sergey) http://cxf.547215.n5.nabble.com/Consume-quot-application-x-www-form-urlencoded-quot-Content-Type-in​​-REST-Web-Service -cxf-rsServer-td5730399.html#a5730446

不同的解決方案是:

  • 具有Form或MultivaluedMap參數而不是AmountTransaction並手動填充AmountTransaction
  • 有一個自定義提供程序(如您所建議)
  • 使用cxf擴展名@FormParam(“”)與AmountTransaction
  • 使用JAX-RS 2.0 @BeanParam並使用FormParam注釋AmountTransaction屬性

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM