如何替换WSO2 API Manager 1.10.0自定义处理程序中的响应正文

如何替换WSO2 API Manager 1.10.0自定义处理程序中的响应正文,wso2,wso2-am,Wso2,Wso2 Am,我已经编写了一个CustomHandler来验证请求中是否有特定的密钥。如果密钥丢失,处理程序应该向客户机发送返回响应,并显示该密钥丢失的文本。当向服务器发送get请求时,头中没有密钥,服务器将使用修改后的负载向客户端作出响应。但是,当post请求发送到服务器时,它会发回客户端发送的原始有效负载。下面是使用修改后的负载将响应发送回客户端的代码 private void handleAuthenticationFailure(MessageContext messageContext, APISe

我已经编写了一个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;
}

我错过什么了吗?如何删除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);
}