如何在WSO2 API Manager 1.10.0自定义处理程序中替换响应主体

时间:2016-01-26 18:04:47

标签: wso2 wso2-am

我编写了一个CustomHandler,用于验证请求中是否有特定的密钥。如果缺少密钥,则处理程序应将响应发送回客户端,并显示缺少密钥的文本。当get请求被发送到服务器而没有标头中的密钥时,服务器使用修改的有效负载响应客户端。但是,当一个post请求发送到服务器时,它会发回客户端发送的原始有效负载。下面是使用修改后的有效负载将响应发送回客户端的代码。

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

我错过了什么吗?如何删除发布请求的原始有效负载并发回修改后的有效负载?谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

我们有类似的要求:替换HTTP响应的主体有效负载中的任意字符串。我们通过自定义中介实现了这一点,但该方法应该通过处理程序同样有效。

我们通过使用synapse JsonUtil(org.apache.synapse.commons.json.JsonUtil)避免使用XML解析,构造和注入,特别是String jsonResponse = JsonUtil.jsonPayloadToString(axis2)来读取有效负载主体和JsonUtil.newJsonPayload(axis2, jsonResponse, true, true)来写

如果您要求有效内容采用XML格式,那么您需要查看Utils.setFaultPayloadUtils.sendFault,可以在org.wso2.carbon.apimgt.gateway.handlers包中找到在https://github.com/wso2/carbon-apimgt/blob/master/components/apimgt/org.wso2.carbon.apimgt.gateway/src/main/java/org/wso2/carbon/apimgt/gateway/handlers/Utils.java

    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);
}