当前位置: 首页 > 知识库问答 >
问题:

在REST webservices中与Content-Type“Application/x-www-form-urlencoded”作斗争

仉昱
2023-03-14

感谢您就我在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" />

当我发送内容类型为“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]}
--------------------------------------

共有1个答案

公冶鸣
2023-03-14

一份汤(谢尔盖的)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属性
 类似资料:
  • 当内容类型不是text/html、text/plain或text/xml,而是application/x-www-form-urlencoded内容类型时,我很难理解如何设置字符集。 给出以下(简化的)javascript代码: 如果我没有显式设置编码, Firebug告诉我内容类型是"Application/x-www-form-urlencoded; charset=UTF-8"。 例如,如果

  • 问题内容: 我曾经有ElasticSearch 5.2,并且刚升级到6.0。 我正在尝试按照此处的指南创建索引模板,但出现错误 我的查询是 问题答案: 要解决此问题,请添加curl选项 这个错误是由于 严格的内容类型检查 在ElasticSearch 6.0中引入,在解释这个岗位 从Elasticsearch 6.0开始,所有包含主体的REST请求也必须提供该主体的正确内容类型。

  • 问题内容: 我已经将Elasticsearch(5.5版)集成到Gitlab中并尝试使用它。这是我从外部Windows客户端发送的命令: 但这不起作用。在客户端上,我得到以下错误: {“错误”:“不支持Content-Type标头[应用程序/ x-www-form-urlencoded]”,“状态”:406} curl:(6)无法解析主机:text curl:(3)[globbing ]第1列 c

  • 我有一个SOAP客户端发送一个请求,它的内容类型定义为应用程序/x-wow-form-urlencoded。我的jax-ws服务器响应HTTP 415错误,抱怨它需要文本/xml的内容类型。 显然,无法更改此客户端,因此我正在尝试找出是否有任何方法可以强制我的服务器接受此内容类型?

  • RESTAPI在映射到Java对象时采用输入内容类型:application/x-www-form-urlencoded,如 在表单输入请求中,我正在设置my_name和my_phone的值,但MyRequest对象的myName和myPhone为null。 我正在使用Jackson annotations 2.3 jar 有什么建议吗?可能有什么问题?

  • 问题内容: 之间有什么区别 request.ContentType =“ application / json; charset = utf-8”; 和 webRequest.ContentType =“ application / x-www-form-urlencoded”; 问题答案: 第一种情况是告诉Web服务器您正在发布JSON数据,如下所示: 第二个选项是告诉Web服务器您将对URL中