如何替换WSO2 API Manager 1.10.0自定义处理程序中的响应正文
我已经编写了一个CustomHandler来验证请求中是否有特定的密钥。如果密钥丢失,处理程序应该向客户机发送返回响应,并显示该密钥丢失的文本。当向服务器发送get请求时,头中没有密钥,服务器将使用修改后的负载向客户端作出响应。但是,当post请求发送到服务器时,它会发回客户端发送的原始有效负载。下面是使用修改后的负载将响应发送回客户端的代码如何替换WSO2 API Manager 1.10.0自定义处理程序中的响应正文,wso2,wso2-am,Wso2,Wso2 Am,我已经编写了一个CustomHandler来验证请求中是否有特定的密钥。如果密钥丢失,处理程序应该向客户机发送返回响应,并显示该密钥丢失的文本。当向服务器发送get请求时,头中没有密钥,服务器将使用修改后的负载向客户端作出响应。但是,当post请求发送到服务器时,它会发回客户端发送的原始有效负载。下面是使用修改后的负载将响应发送回客户端的代码 private void handleAuthenticationFailure(MessageContext messageContext, APISe
private void handleAuthenticationFailure(MessageContext messageContext, APISecurityException e){
SOAPBody body = messageContext.getEnvelope().getBody();
for (Iterator itr = body.getChildElements(); itr.hasNext();) {
OMElement child = (OMElement) itr.next();
child.detach();
}
org.apache.axis2.context.MessageContext axis2MC = ((Axis2MessageContext) messageContext).
getAxis2MessageContext();
axis2MC.setProperty(Constants.Configuration.CONTENT_TYPE, "application/xml");
axis2MC.removeProperty("NO_ENTITY_BODY");
axis2MC.setProperty("HTTP_SC", HttpStatus.SC_UNAUTHORIZED);
messageContext.setResponse(true);
messageContext.setProperty("RESPONSE", "true");
messageContext.setTo(null);
messageContext.getEnvelope().getBody().addChild(getFaultPayload(e));
Axis2Sender.sendBack(messageContext);
}
private OMElement getFaultPayload(APISecurityException e) {
OMFactory fac = OMAbstractFactory.getOMFactory();
OMNamespace ns = fac.createOMNamespace(APISecurityConstants.API_SECURITY_NS,
APISecurityConstants.API_SECURITY_NS_PREFIX);
OMElement payload = fac.createOMElement("fault", ns);
OMElement errorCode = fac.createOMElement("code", ns);
errorCode.setText(String.valueOf(e.getErrorCode()));
OMElement errorMessage = fac.createOMElement("message", ns);
errorMessage.setText("Missing Credentials");
OMElement errorDetail = fac.createOMElement("description", ns);
errorDetail.setText(e.getMessage());
payload.addChild(errorCode);
payload.addChild(errorMessage);
payload.addChild(errorDetail);
return payload;
}
我错过什么了吗?如何删除post请求的原始有效负载并发回修改后的有效负载?感谢您的帮助。我们有一个类似的要求:替换HTTP响应主体负载中的任意字符串。我们通过自定义中介实现了这一点,但该方法应该通过处理程序同样有效 我们通过使用synapse JsonUtil(org.apache.synapse.commons.json.JsonUtil),特别是
String jsonResponse=JsonUtil.jsonPayloadToString(axis2)
来读取有效负载主体,并JsonUtil.newJsonPayload(axis2,jsonResponse,true,true)
来编写,从而避免了使用XML解析、构造和注入
如果您要求有效负载为XML格式,则需要查看Utils.setFaultPayload
和Utils.sendFault
,可以在其org.wso2.carbon.apimgt.gateway.handlers包中找到
我们有一个类似的需求:替换HTTP响应的主体负载中的任意字符串。我们通过自定义中介实现了这一点,但该方法应该通过处理程序同样有效 我们通过使用synapse JsonUtil(org.apache.synapse.commons.json.JsonUtil),特别是
String jsonResponse=JsonUtil.jsonPayloadToString(axis2)
来读取有效负载主体,并JsonUtil.newJsonPayload(axis2,jsonResponse,true,true)
来编写,从而避免了使用XML解析、构造和注入
如果您要求有效负载为XML格式,则需要查看Utils.setFaultPayload
和Utils.sendFault
,可以在其org.wso2.carbon.apimgt.gateway.handlers包中找到
public static void setFaultPayload(MessageContext messageContext, OMElement payload) {
org.apache.axis2.context.MessageContext axis2MC = ((Axis2MessageContext) messageContext).
getAxis2MessageContext();
JsonUtil.removeJsonPayload(axis2MC);
messageContext.getEnvelope().getBody().addChild(payload);
Map headers = (Map) axis2MC.getProperty(org.apache.axis2.context.MessageContext.TRANSPORT_HEADERS);
String acceptType = (String) headers.get(HttpHeaders.ACCEPT);
//If an Accept header has been provided.
if(!StringUtils.isEmpty(acceptType) && !"*/*".equals(acceptType)){
axis2MC.setProperty(Constants.Configuration.MESSAGE_TYPE, acceptType);
}
}
public static void sendFault(MessageContext messageContext, int status) {
org.apache.axis2.context.MessageContext axis2MC = ((Axis2MessageContext) messageContext).
getAxis2MessageContext();
axis2MC.setProperty(NhttpConstants.HTTP_SC, status);
messageContext.setResponse(true);
messageContext.setProperty("RESPONSE", "true");
messageContext.setTo(null);
axis2MC.removeProperty("NO_ENTITY_BODY");
// Always remove the ContentType - Let the formatter do its thing
axis2MC.removeProperty(Constants.Configuration.CONTENT_TYPE);
Map headers = (Map) axis2MC.getProperty(org.apache.axis2.context.MessageContext.TRANSPORT_HEADERS);
if (headers != null) {
headers.remove(HttpHeaders.AUTHORIZATION);
headers.remove(HttpHeaders.AUTHORIZATION);
headers.remove(HttpHeaders.HOST);
}
Axis2Sender.sendBack(messageContext);
}