私は実際のテキストの代わりに私の応答で奇妙なシンボルを取得しています

I have SoapBuilder class in android that calls out to a webservice. Now I have used it in a previous application and it worked great. The problem with this new application is that instead of me getting the actual response back, I am getting what looks like some sort of wing ding symbols. My webservice is a .net webservice like my other application. The only difference that I can see is that I was using a ssl on my previous app and now I'm not. So I changed all of my socket stuff ssl to reg sockets and socketfactorys. Here is my code I get the weird symbols when I am reading the in (bufferedreader) StringBuilder contentBuilder = new StringBuilder(contentLength);

if (contentLength > 0) {
    int readBytes = 0;
    int c = -1;
    while ((c = in.read()) != -1) {
        contentBuilder.append((char) c);
        readBytes++;
    }
}           

以下は、 SoapBuilder のコード全体です。

public class SoapBuilder {
    private final String TAG = "SOAPBUILDER";
    String Server = SQBApplication.SOAP_SERVER;
    String WebServicePath = SQBApplication.SOAP_WEBSERVICEPATH;
    String SoapAction = "";
    String MethodName = "";
    String XmlNamespace = SQBApplication.SOAP_XMLNAMESPACE;
    Integer Port = SQBApplication.SOAP_PORT;
    Integer BufferSize = 2048;
   //boolean IsSSL = true;
    private ArrayList ParamNames = new ArrayList();
    private ArrayList ParamData = new ArrayList();

    public SoapBuilder(String soapMethod) {
        MethodName = soapMethod;
        SoapAction = XmlNamespace + MethodName;
    }

    public SoapBuilder(String server, String soapMethod)
    {
        MethodName = soapMethod;
        SoapAction = XmlNamespace + MethodName;
        Server = server;
    }

    public SoapBuilder(String server, String webServicePath, String namespace, String soapMethod)
    {
        MethodName = soapMethod;
        XmlNamespace = namespace;
        SoapAction = XmlNamespace + MethodName;
        Server = server;
        WebServicePath = webServicePath;
    }

    public void AddParameter(String Name, String Data) {
        ParamNames.add(Name);
        ParamData.add(Data);
    }

    public String sendRequest() throws Exception {
        String retval = "";
        String message = "";

        StringBuilder postAction = new StringBuilder();
       //send an HTTP request to the web service
        postAction.append("POST " + WebServicePath + " HTTP/1.1\n");
        postAction.append("Content-Type: text/xml; charset=utf-8\n");
        postAction.append("SOAPAction: \"" + SoapAction + "\"\n");
        postAction.append("Host: " + Server + ":" + Port + "\n");
        postAction.append("Content-Length: %s\n");
        postAction.append("Expect: 100-continue\n");
        postAction.append("Accept-Encoding: gzip, deflate\n");
        postAction.append("Connection: Close\n");
        postAction.append("\n");
        ArrayList envelope = new ArrayList();
        envelope.add("");
        envelope.add("");
        envelope.add("<" + MethodName + " xmlns=\"" + XmlNamespace + "\">");
       //Parameters passed to the method are added here
        for (int t = 0; t < ParamNames.size(); t++) {
            String name = (String) ParamNames.get(t);
            String data = (String) ParamData.get(t);
            envelope.add("<" + name + ">" + data + "");
        }
        envelope.add("");
        envelope.add("");
        envelope.add("");

        int si = 0;
        for (int i = 0; i < envelope.size(); i++) {
            si += envelope.get(i).length();
        }

        StringBuilder bodyBuilder = new StringBuilder(si);
        for (int i = 0; i < envelope.size(); i++) {
            bodyBuilder.append(envelope.get(i));
        }
        message = String.format(postAction.toString(),
        Integer.toString(bodyBuilder.length()));
        message += bodyBuilder.toString();
        Socket socket = null;
        boolean autoflush = true;
        try {
            SocketFactory socketFactory = (SocketFactory) SocketFactory
                .getDefault();
            socket = (Socket) socketFactory.createSocket(Server, Port);
            PrintWriter out = new PrintWriter(socket.getOutputStream(),
            autoflush);

            System.out.println("request length: " + message.length());
            if(message.length() > Integer.MAX_VALUE)
            {
                throw new IOException("message length exceeds max size");
            }
            socket.setSendBufferSize(message.length());
            //only except if the message wouldn't have succeeded anyway
            if(socket.getSendBufferSize() < message.length() && socket.getSendBufferSize() != message.length())
            {
                throw new Exception();
            }

            out.print(message);
            out.flush();

        } catch (Exception e) {

        }

        BufferedReader in = new BufferedReader(new InputStreamReader(
        socket.getInputStream(), "UTF-8"), BufferSize);
        StringBuilder response = new StringBuilder();

        int ci;

        Pattern httpPattern = Pattern.compile(
            "HTTP/1.\\d\\s+(\\d+)\\s+[\\w\\s]+\\r\\n",
            Pattern.CASE_INSENSITIVE);
        Pattern contentLengthPattern = Pattern.compile(
            "Content-Length\\:\\s*(\\d+)\\r\\n",
            Pattern.CASE_INSENSITIVE);
        int contentLength = -1;
        String httpResponse = "";
        while ((ci = in.read()) != -1) {
            response.append((char) ci);
            Matcher lengthMatcher = contentLengthPattern.matcher(response
                .toString());
            Matcher httpMatcher = httpPattern.matcher(response.toString());

            if (lengthMatcher.find()) {
                contentLength = Integer.parseInt(lengthMatcher.group(1));
            }
            if (httpMatcher.find()) {
                httpResponse = httpMatcher.group(1);
            }

            if (contentLength > 0) {
               //contentLength+=2;
                break;
            }
        }

        StringBuilder contentBuilder = new StringBuilder(contentLength);
        if (contentLength > 0) {
            int readBytes = 0;
            int c = -1;
            while ((c = in.read()) != -1) {
                contentBuilder.append((char) c);
                readBytes++;
            }

        }

        System.out.println(httpResponse);
        if (httpResponse.equals("200")) {

            Pattern responsePattern = Pattern.compile(
                "",
                Pattern.CASE_INSENSITIVE | Pattern.DOTALL
                | Pattern.MULTILINE);

            Pattern responseNullPattern = Pattern.compile("<" + MethodName
                + "Response.+?/>", Pattern.CASE_INSENSITIVE
                | Pattern.DOTALL | Pattern.MULTILINE);
            Matcher responseMatcher = responsePattern
                .matcher(contentBuilder);
            Matcher responseNullMatcher = responseNullPattern
                .matcher(contentBuilder);
            System.out.println(contentBuilder);
            if (responseMatcher.find()) {
                retval = responseMatcher.group(0);// responseMatcher.group(0);
            } else if (responseNullMatcher.find()) {
                retval = null;
            }
        } else if (httpResponse.equals("500")) {
            Pattern faultPattern = Pattern.compile(
                "",
                Pattern.CASE_INSENSITIVE | Pattern.DOTALL
                | Pattern.MULTILINE);
            Matcher faultMatcher = faultPattern.matcher(contentBuilder);
            faultMatcher.find();
            retval = faultMatcher.group(0);
        } else {
            throw new Exception(String.format(
                "HTTP response not recognized: %s", httpResponse));
        }

        in.close();
        socket.close();
        return retval;
    }
}
0
期待どおりに返される実際の、間違ったデータ(16進数、文字ではない)を表示します。
追加された 著者 Thorbjørn Ravn Andersen,
文字ではなく、16進ダンプ。
追加された 著者 Thorbjørn Ravn Andersen,
彼らの多くは何のように見えますか。主にウィングディング
追加された 著者 user638049,
どのようにJavaで16進ダンプを行うのですか?
追加された 著者 user638049,

1 答え

私はこれがエンコーディングの問題であることをかなり保証することができます。 Wycatsはこれに優れた記事を書いておきます(Rubyの特異性を無視してください):

http: //yehudakatz.com/2010/05/05/ruby-1-9-encodings-a-primer-and-the-solutions-for-rails/

0
追加された
それにかかわらず、チェーン内のすべてのリンクもUTF-8を使用しているわけではありません
追加された 著者 Neil Middleton,
私のWebサービス定義では、リクエストがUTF-8であると想定しています。上記のように、私のsoapbuilderはUTF-8を使用しているため、両方が同じです。
追加された 著者 user638049,
それでは、なぜ私の最後のWebサービスでうまくいくのでしょうか?上記のsoapbuilderに基づいてチェーンのその他の部分をチェックする必要がありますか?
追加された 著者 user638049,
さて、私はちょうど私のsoapbuilderを私の他のwebserviceでテストしました。私はsslsocketsにソケットのものを変更しなければならなかったが、それは私のwebservereで推測するので、素晴らしい仕事をした?私のWSDLを見ると、それはutd-8で返されることがわかります。記事はあまり役に立たなかったので、具体的な詳細なヘルプは素晴らしいでしょう。ありがとう
追加された 著者 user638049,
私の上のsoapbuilderに基づいてこの状況で私を助けることができる人はいますか?
追加された 著者 user638049,