Rest 骡子休息APIKit-我的流量不是';我不回一个乱七八糟的尸体
**多亏了neildo,问题解决了。以下是从帖子中获得回复所需的步骤Rest 骡子休息APIKit-我的流量不是';我不回一个乱七八糟的尸体,rest,mule,synchronous,Rest,Mule,Synchronous,**多亏了neildo,问题解决了。以下是从帖子中获得回复所需的步骤 RAML文件必须具有响应体定义 HTTP端点必须设置为请求-响应 使用同步处理策略的所有流 在请求中接受并将内容类型HTTP头设置为application/json ** 我的REST流的实现调用一个Java API,该API返回一个Java对象。然后,我将该对象转换为JSON文档并将其返回给客户端。我的日志记录步骤是记录正确的数据,但是客户端只有一个200 OK的空主体 我已将所有流设置为同步,将HTTP端点设置为请求-响应
<apikit:config name="IAMPerson-config" raml="IAMPerson.raml" consoleEnabled="true" consolePath="console" doc:name="Router"/>
<apikit:mapping-exception-strategy name="IAMPerson-apiKitGlobalExceptionMapping">
<apikit:mapping statusCode="404">
<apikit:exception value="org.mule.module.apikit.exception.NotFoundException" />
<set-property propertyName="Content-Type" value="application/json" />
<set-payload value="{ "message": "Resource not found" }" />
</apikit:mapping>
...
</apikit:mapping-exception-strategy>
<flow name="IAMPerson-main" doc:name="IAMPerson-main" processingStrategy="synchronous">
<http:inbound-endpoint address="http://localhost:8081/api" doc:name="HTTP" exchange-pattern="request-response" password="admin" user="admin" contentType="application/json"/>
<apikit:router config-ref="IAMPerson-config" doc:name="APIkit Router"/>
<exception-strategy ref="IAMPerson-apiKitGlobalExceptionMapping" doc:name="Reference Exception Strategy"/>
</flow>
<flow name="post:/person:IAMPerson-config" doc:name="post:/person:IAMPerson-config" processingStrategy="synchronous">
<json:json-to-object-transformer doc:name="JSON to Object" returnClass="PersonDTO"/>
<invoke name="invokeCreate" object-ref="personService" method="create" methodArguments="#[payload]"></invoke>
<json:object-to-json-transformer sourceClass="Person" doc:name="Person Object to JSON"/>
<logger level="INFO" doc:name="Logger" message="#[payload]"/>
</flow>
<flow name="put:/person:IAMPerson-config" doc:name="put:/person:IAMPerson-config" processingStrategy="synchronous">
<logger level="INFO" doc:name="Logger" message="#[payload]"/>
<json:json-to-object-transformer doc:name="JSON to Object" returnClass="PersonDTO"/>
<invoke name="invokeUpdate" object-ref="personService" method="update" methodArguments="#[payload]"/>
<json:object-to-json-transformer sourceClass="Person" doc:name="Person Object to JSON"/>
<logger level="INFO" doc:name="Logger" message="#[payload]"/>
</flow>
在raml文件中,确保资源方法将响应体映射为application/json。例如
/person:
post:
responses:
200:
body:
application/json:
我也有同样的问题(使用3.5.0版),但是有一个GET请求。建议的解决方案(无论是编辑问题顶部的第1项到第4项,还是检查答案)都没有为我解决问题。(在我的案例中,大多数都是正确的。)
对我来说,有效的方法是在有问题的GET流的XML底部添加以下内容:
<response>
<set-property propertyName="Content-Type" value="application/json"/>
</response>
不幸的是,使用可视化编辑器(在“消息流”选项卡中)似乎无法做到这一点。我不得不在“配置XML”选项卡中手动执行此操作
此外,在主流程(调用APIKit路由器的流程)中插入上述元素(出于某种原因必须在
元素之前执行)并不能解决问题。然而,在这种情况下,响应元素确实会显示在可视化编辑器中。在我意识到这是如何造成的之前,我已经看了15遍这个页面。我添加了一个转换器来进行身份验证。我自定义了onCall
方法,但将transformMessage
作为默认值,设置为200并返回null
瞧,将
return null
更改为return message
使一切都恢复正常。对RAML文件中的200个状态代码使用这种响应格式。
响应:
200:
正文:
application/json:请提供一些代码来查看您在做什么Hi David,不只是PUT和POST。这两个操作的响应状态代码不是204吗?如果是这样的话,那么我认为这是一个特性,而不是一个bug。对于POST,位置头应该指向新的资源URI,而对于PUT,您已经知道位置。对于成功的POST和PUT,我将获得200状态码。对象的主键由表生成。REST实现中调用的Java(JPA)层返回带有PK的Person(以及相关对象的集合)对象。我正在尝试将该数据返回到客户端。与此方法调用类似:Person p=svc.create(personDTO);谢谢你的回复。事实上,我上周试过了,我得到了Mule返回的空指针。我刚刚更新了我的帖子。你是使用APIKit控制台还是自己的客户端来调用Mule?可能您没有设置请求头“content-type:application/json”和“Accept:application/json”。Accept:application/json做到了这一点。我正在设置内容类型,但没有设置接受。顺便说一句,我正在使用谷歌的免费REST客户端,因为Mule控制台应用程序突然停止工作。当我加载网页时,我只看到HTML,而不是我可以使用的实际UI。很奇怪。您是否愿意将您的评论作为官方答案发布,以便我能给予您信任?我将用解决方案更新我的帖子。谢谢你,感谢所有的回答!没关系,我可以把这篇文章归功于你。再次感谢!要修复控制台,您应该从http:inbound端点删除contentType=“application/json”。您不需要它,因为apikit会根据需要为您设置它。这会导致控制台的html/js/css使用content-type=json,这会导致浏览器呈现错误。
<response>
<set-property propertyName="Content-Type" value="application/json"/>
</response>