Talend:tRESTClient returns 删除后响应为空
Talend: tRESTClient returns empty response after delete
我是 Talend 的新手。我使用 5.6.1 Talend Studio。我正在使用 tRESTClient 向服务发送 DELETE 请求。我希望得到 xml 带有错误代码的响应。
在客户端日志中我可以看到我需要的 xml,但是响应行中的正文和字符串值都是空的。
tRESTClient 日志:
ID: 1
Response-Code: 200
Encoding: ISO-8859-1
Content-Type: application/xml
Headers:
{Content-Length=[492],
content-type=[application/xml],
Date=[Mon, 18 May 2015 15:02:24 GMT],
Server=[Apache-Coyote/1.1]}
Payload:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns1:Response xmlns:ns1="..." xmlns:ns2="...">
<ns1:IsSuccess>false</ns1:IsSuccess>
<ns1:ErrorList>
<ns2:Error>
<ns2:Code>80</ns2:Code>
<ns2:Description>Can't find service</ns2:Description>
<ns2:Severity>error</ns2:Severity>
</ns2:Error>
</ns1:ErrorList>
</ns1:Response>
我尝试将负载和其他字段添加到客户端输出行,但没有结果。
客户端之后的 tLogRow:
|200|||
XML 需要进一步处理,纯状态代码是不够的。 POST 和 GET 请求工作正常,我在字符串或正文字段中获取响应数据。当使用带有 SOAP UI 等工具的 DELETE 服务时,一切都很好,我收到预期的 XML.
谁能告诉我为什么我会遇到这个问题以及如何解决它?
更新:
使用调试器我发现用于为输出行生成正文或字符串的 responseDoc_tRESTClient_1 始终为空。它在开始时用 null 初始化,并且永远不会改变。
看起来问题出在为服务调用生成的代码上。例如,如果我们发送 GET 请求,它会生成以下代码:
responseDoc_tRESTClient_1 = webClient_tRESTClient_1.get(responseClass_tRESTClient_1);
如果我们发送 DELETE 请求,它会生成以下代码:
webClient_tRESTClient_1.invoke("DELETE", requestBody_tRESTClient_1);
我看到 webClient
也有方法 .delete()
,returns 响应作为 .get(...)
方法。有没有办法强制 Talend
使用 .delete()
方法而不是 .invoke()
?
我设法找到了这个问题的解决方案。
我用创建 cxf 客户端、调用服务并将响应添加到输出行的 tJavaRow 替换了 tRESTClient 组件。
WebClient client = WebClient.create(context.serviceFullUrl);
client.path("rest/path/"+in1.serviceId);
client.accept("application/xml");
Response response = client.delete();
String r = response.readEntity(String.class);
output_row.statusCode = response.getStatus();
output_row.string = r;
output_row.body = null;
进口:
import javax.ws.rs.core.Response;
import org.apache.cxf.jaxrs.client.WebClient;
Talend Studio 可能会抛出 NoClassDefFoundError,但在运行时作业运行良好。
但我很确定应该有更好的解决方案。
我是 Talend 的新手。我使用 5.6.1 Talend Studio。我正在使用 tRESTClient 向服务发送 DELETE 请求。我希望得到 xml 带有错误代码的响应。
在客户端日志中我可以看到我需要的 xml,但是响应行中的正文和字符串值都是空的。 tRESTClient 日志:
ID: 1
Response-Code: 200
Encoding: ISO-8859-1
Content-Type: application/xml
Headers:
{Content-Length=[492],
content-type=[application/xml],
Date=[Mon, 18 May 2015 15:02:24 GMT],
Server=[Apache-Coyote/1.1]}
Payload:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns1:Response xmlns:ns1="..." xmlns:ns2="...">
<ns1:IsSuccess>false</ns1:IsSuccess>
<ns1:ErrorList>
<ns2:Error>
<ns2:Code>80</ns2:Code>
<ns2:Description>Can't find service</ns2:Description>
<ns2:Severity>error</ns2:Severity>
</ns2:Error>
</ns1:ErrorList>
</ns1:Response>
我尝试将负载和其他字段添加到客户端输出行,但没有结果。 客户端之后的 tLogRow:
|200|||
XML 需要进一步处理,纯状态代码是不够的。 POST 和 GET 请求工作正常,我在字符串或正文字段中获取响应数据。当使用带有 SOAP UI 等工具的 DELETE 服务时,一切都很好,我收到预期的 XML.
谁能告诉我为什么我会遇到这个问题以及如何解决它?
更新:
使用调试器我发现用于为输出行生成正文或字符串的 responseDoc_tRESTClient_1 始终为空。它在开始时用 null 初始化,并且永远不会改变。
看起来问题出在为服务调用生成的代码上。例如,如果我们发送 GET 请求,它会生成以下代码:
responseDoc_tRESTClient_1 = webClient_tRESTClient_1.get(responseClass_tRESTClient_1);
如果我们发送 DELETE 请求,它会生成以下代码:
webClient_tRESTClient_1.invoke("DELETE", requestBody_tRESTClient_1);
我看到 webClient
也有方法 .delete()
,returns 响应作为 .get(...)
方法。有没有办法强制 Talend
使用 .delete()
方法而不是 .invoke()
?
我设法找到了这个问题的解决方案。
我用创建 cxf 客户端、调用服务并将响应添加到输出行的 tJavaRow 替换了 tRESTClient 组件。
WebClient client = WebClient.create(context.serviceFullUrl);
client.path("rest/path/"+in1.serviceId);
client.accept("application/xml");
Response response = client.delete();
String r = response.readEntity(String.class);
output_row.statusCode = response.getStatus();
output_row.string = r;
output_row.body = null;
进口:
import javax.ws.rs.core.Response;
import org.apache.cxf.jaxrs.client.WebClient;
Talend Studio 可能会抛出 NoClassDefFoundError,但在运行时作业运行良好。
但我很确定应该有更好的解决方案。