cancel
Showing results for 
Search instead for 
Did you mean: 

BO SDK输出乱码引起报错问题

former_member197088
Participant
0 Kudos

图1:使用JAVA调用方法获得的数据为正常中文

图2:使用同样方法调用出来的为乱码,不同的地方在于前面的存在TOKEN,后面这个直接调用方法(难道和TOKEN也有关?)

图3:JSP代码图,其中charset修改为UTF-8,ISO8859-1,GB2312等都无效。

哪位大神帮忙解答下啊,卡了一周了~~~~

Accepted Solutions (1)

Accepted Solutions (1)

xiaoping_zheng
Employee
Employee
0 Kudos

您好,我不太确定您是怎么在jsp实现的,不过您可以尝试下下面这段示例代码,我在我的Tomcat环境中测试是可以取到中文的,它的逻辑就是,先登录获取token,然后获取指定报表的第一个query里的参数。

我个人觉得比较重要的是处理返回文字的这一行:

String responseBody = new String(EntityUtils.toString(entity).getBytes("ISO_8859_1"), "UTF-8");

因为httpclient对restful获取的结果解析,貌似默认是ISO_8859_1编码,因此需要上面的语句来重新转码回UTF-8,便可以使中文不再乱码。

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<%@ page import = "org.apache.http.client.ResponseHandler"%>
<%@ page import = "org.apache.http.client.HttpClient"%>
<%@ page import = "org.apache.http.client.methods.HttpGet"%>
<%@ page import = "org.apache.http.client.methods.HttpPost"%>
<%@ page import = "org.apache.http.impl.client.BasicResponseHandler"%>
<%@ page import = "org.apache.http.impl.client.DefaultHttpClient"%>
<%@ page import = "org.apache.http.entity.StringEntity"%>
<%@ page import = "org.apache.http.client.HttpResponseException"%>
<%@ page import = "org.apache.http.HttpResponse"%>
<%@ page import = "org.apache.http.HttpEntity"%>
<%@ page import = "org.apache.http.client.methods.HttpPut"%>
<%@ page import = "org.apache.http.util.EntityUtils"%>
<%@ page import = "javax.xml.parsers.DocumentBuilderFactory"%>
<%@ page import = "javax.xml.parsers.DocumentBuilder"%>
<%@ page import = "org.w3c.dom.*"%>
<%@ page import = "org.w3c.dom.Node.*"%>
<%@ page import = "org.w3c.dom.Element"%>
<%@ page import = "com.sun.org.apache.xerces.internal.parsers.*"%>
<%@ page import = "org.xml.sax.InputSource"%>
<%@ page import = "org.apache.http.client.entity.UrlEncodedFormEntity"%>
<%@ page import = "org.apache.http.client.utils.URLEncodedUtils"%>
<%@ page import = "org.apache.http.message.BasicNameValuePair"%>
<%@ page import = "org.apache.http.NameValuePair"%>
<%@ page import = "org.apache.http.HttpHost"%>
<%@ page import = "org.apache.http.conn.params.*"%>
<%@ page import = "java.io.*"%>
<%@ page import = "java.util.List"%>
<%@ page import = "java.util.ArrayList"%>

<%

// Enterprise Authentication Credentials
String boUsername = "bouser";
String boPassword = "bopassword";
String boAuthType = "secEnterprise";

// Sample Reports
String reportID = "8190";

// Restful URL's
final String baseURL = "http://localhost:6405/biprws";
final String logonURL = baseURL + "/logon/long";
final String logoffURL = baseURL + "/logoff";
final String baseWebiURL = baseURL + "/raylight/v1/documents";

String Parameters = "";

try {

    String xmlString = "";
    String documentID = "";
    String logonToken = "";
   
   
    // Logon Post
    xmlString = "<attrs><attr name=\"userName\" type=\"string\" >" + boUsername + "</attr><attr name=\"password\" type=\"string\" >" + boPassword + "</attr><attr name=\"auth\" type=\"string\" possibilities=\"secEnterprise,secLDAP,secWinAD,secSAPR3\">" + boAuthType + "</attr></attrs>";
    String logonXML = restPost(logonURL, xmlString, "","","","");
       
    // Get the token
    logonToken = "\"" + getLogonTokenFromXML(logonXML) + "\"";
   
    String exportFormatHeader;
    String fileExt;
    String dataprovidersURL = baseWebiURL + "/" + reportID +"/dataproviders";
   
    HttpClient httpclient = new DefaultHttpClient();
    try {  
       
        HttpGet httpget = new HttpGet(dataprovidersURL);
        httpget.addHeader("X-SAP-LogonToken",logonToken);
        httpget.addHeader("Accept", "application/xml");
        httpget.addHeader("Content-Type", "application/xml");
           
        HttpResponse myResponse = httpclient.execute(httpget);
        int statusCode = myResponse.getStatusLine().getStatusCode();
       
        // Get the 1st DP
        HttpEntity entity = myResponse.getEntity();
       
        String responseBody = new String(EntityUtils.toString(entity).getBytes("ISO_8859_1"), "UTF-8");
       
        String dpid = getFirstDataProviderFromXML(responseBody);
       
        httpget = new HttpGet(dataprovidersURL + "/" + dpid + "/parameters?LovInfo=false");
        httpget.addHeader("X-SAP-LogonToken",logonToken);
        httpget.addHeader("Accept", "application/xml");
        httpget.addHeader("Content-Type", "application/xml");
           
        myResponse = httpclient.execute(httpget);
        statusCode = myResponse.getStatusLine().getStatusCode();
       
        // Get the Parameter (Prompt) Info
        entity = myResponse.getEntity();
       
        responseBody = new String(EntityUtils.toString(entity).getBytes("ISO_8859_1"), "UTF-8");
       
        Parameters = getParametersFromXML(responseBody);
       
    } finally {
        // When HttpClient instance is no longer needed,
        // shut down the connection manager to ensure
        // immediate deallocation of all system resources
        httpclient.getConnectionManager().shutdown();
    }
   
} catch (IOException eIO) {
    out.println("IO Exception: " + eIO);
} catch (Exception ex) {
    out.println("Exception: " + ex);
}

%>


<%!

public Document convertStringToDom(String domXMLSTring) throws Exception {
    DOMParser parser = new DOMParser();
    parser.parse(new InputSource(new java.io.StringReader(domXMLSTring)));
    return (parser.getDocument());
}

public String getLogonTokenFromXML(String xmlString) throws Exception {
    Document doc = convertStringToDom(xmlString);
    NodeList nodes = doc.getElementsByTagName("attr");

    for (int i = 0; i < nodes.getLength(); i++) {
        Element element = (Element) nodes.item(i);
       
        // Is this the correct XML token
        if (element.getAttribute("name").equals("logonToken")) {
            return(element.getTextContent());
        }
    }
    return("");
}

public String getFirstDataProviderFromXML(String xmlString) throws Exception {
    Document doc = convertStringToDom(xmlString);
    NodeList nodes = doc.getElementsByTagName("id");
    Element element = (Element) nodes.item(0);
    return(element.getTextContent());
}

public String getParametersFromXML(String xmlString) throws Exception {
    Document doc = convertStringToDom(xmlString);
    NodeList nodes = doc.getElementsByTagName("name");
   
    String Parameters = "";

    for (int i = 0; i < nodes.getLength(); i++) {
        Element element = (Element) nodes.item(i);
       
        if (i != 0)
        {
            Parameters = Parameters + " ";
        }
        // Is this the correct XML token
        Parameters = Parameters + element.getTextContent();
    }
    return(Parameters);
}

public static String restPost(String urlStr, String XMLString, String param1Name, String param1Value, String param2Name, String param2Value ) throws Exception {
   
    HttpClient httpclient = new DefaultHttpClient();
    try {
       
        HttpPost httpPost = new HttpPost(urlStr);
        httpPost.addHeader("Accept", "application/xml");
        httpPost.addHeader("Content-Type", "application/xml");
       
        if (!param1Name.equals("")) {
            httpPost.addHeader(param1Name, param1Value);
        }
        if (!param2Name.equals("")) {
            httpPost.addHeader(param2Name, param2Value);
        }
       
        httpPost.setEntity(new StringEntity(XMLString));
           
        HttpResponse response = httpclient.execute(httpPost);
        int statusCode = response.getStatusLine().getStatusCode();
        HttpEntity entity = response.getEntity();
        String responseBody = new String(EntityUtils.toString(entity).getBytes("ISO_8859_1"), "UTF-8");
        return responseBody;
    } finally {
        // When HttpClient instance is no longer needed,
        // shut down the connection manager to ensure
        // immediate deallocation of all system resources
        httpclient.getConnectionManager().shutdown();
    }
}

%>


<html>
    <head>
        <meta content="IE=edge" http-equiv="X-UA-Compatible">
        <meta content="text/html; charset=UTF-8" http-equiv="content-type">
    </head>
    <body>
        <%=Parameters%>
    </body>
</html>

former_member197088
Participant
0 Kudos

太感谢了,我先试试,尝试无数办法,各种无效。

former_member197088
Participant
0 Kudos

提示gettextcontent()是未定义的类型元素。

former_member197088
Participant
0 Kudos

知道原因了,谢谢

former_member197088
Participant
0 Kudos

请问用的哪个版本的slf4j-api和slf4j-log4j12?自己用了各种版本调试都会报个错误。就是上面说的那个错误。

xiaoping_zheng
Employee
Employee
0 Kudos

我没用到你说的那些,在我这个sample里,只include了下面的jar

former_member197088
Participant
0 Kudos

好的,谢谢

xiaoping_zheng
Employee
Employee
0 Kudos

其实getTextContent方法是处理取得XML内容的部分,和中文转码不相关。

如果只是关注中文乱码的话,getTextContent出错的话完全可以删掉相关部分,你只需要看每次restful返回的string,经过

String responseBody = new String(EntityUtils.toString(entity).getBytes("ISO_8859_1"), "UTF-8");

像这样的处理后,中文是否被正常编码就可以了。

former_member197088
Participant
0 Kudos

嗯,已经完整取出中文所需的数据了,非常感谢。

Answers (0)