代码之家  ›  专栏  ›  技术社区  ›  mattstuehler

Java Servlet和从Flash的XML.sDand加载()函数接收XML

  •  1
  • mattstuehler  · 技术社区  · 16 年前

    全部,

    我正在研究一个Flash应用程序,它应该把XML数据发送给Java servlet。

    我负责Flash应用程序;另一个团队负责Java Servlet。

    我们所面临的问题是,我熟悉Flash,但不熟悉Java和servlet;另一个团队则精通Java和servlet,但不熟悉Flash。

    无论如何,我有一些AS2代码使用sendandload()将XML数据发送到服务器。

    当我把它发送到PHP、ASP或ASP.NET(我熟悉的东西)时,它工作得很好。

    然而,Java团队在使用servlet接收信息方面遇到了困难。

    其中一个开发人员向我发送了一个日志条目:

    GET /portal/delegate/ParticipantService?svc=someServiceName&XMLStr=[the encoded xml I sent] 
    

    据我所知,xml.sendandload使用的是post,而不是get,所以我不理解为什么它会以get的形式出现在日志中。有什么想法或解释吗?

    另外,对于如何告诉开发人员如何接收XML有什么建议吗?

    显然,问题可能出在我的actionscript代码上,但正如我所说,如果我将它发送到一个php页面上,在那里我得到了类似这样的代码:

    $doc = new DomDocument();
    $doc->loadXML(file_get_contents("php://input"));
    

    更新:

    以下是Adobe Technote对此的看法:

    当loadvariables或geturl操作为 用于向Java servlet发送数据 显示数据正在发送 使用get请求,当post 在闪存中指定了方法 电影。

    这是因为闪存发送 采用GET/POST混合格式的数据。如果 正在使用get发送数据 请求,变量将出现在 附加到的结尾的查询字符串 URL。flash使用get服务器 请求,但名称/值对 包含变量的 第二次传输使用柱。 尽管这会导致servlet 触发doget()方法, 变量在 服务器请求。

    所以,我想我需要知道的是如何告诉Java团队查找和捕获已经发送的XML…

    非常感谢!

    2 回复  |  直到 16 年前
        1
  •  4
  •   ZZ Coder    16 年前

    Flash做了一些非常奇怪的事情。这可能不是违法的,但非常不合常规。servlet并没有预料到这一点。它在GET请求中包含消息体。基本上,它是用GET做一个帖子。servlet忽略get的消息体。

    要处理这个问题,Java Servlet必须处理消息体。这并不难。只需读取输入流并将其转换为字符串即可。它是x-www-urlencoded格式。

    这是我用来解析它的代码,

    byte[] buffer = new byte[4096];
    InputStream is = request.getInputStream();
    ByteArrayOutputStrem os = new ByteArrayOutputStream();
    
    for (int read = is.read(buffer); read > 0; read = is.read(buffer)) {
        os.write(buffer, 0, read);
    }
    
    is.close();
    os.close();
    
    String queryString = os.toString("utf-8");
    
    ...
    
           Map<String, String> map = new TreeMap<String, String>();
    
            if (queryString == null)
                    return map;
    
            // Split at & and ignore space/newline at the ends
            String pairs[] = queryString.split("[&\\s]");
    
            for (String pair : pairs) {
                int pos = pair.indexOf('=');
                String key;
                String value;
                try {
                        if (pos == -1) {
                            key = URLDecoder.decode(pair, "UTF-8");
                            value = null;
                        } else {
                                            key = URLDecoder.decode(pair.substring(0, pos), "UTF-8");
                                    value = URLDecoder.decode(pair.substring(pos+1, pair.length()), "UTF-8");
                                    }
                } catch (UnsupportedEncodingException e) {
                                            // All JRE has UTF-8
                                    throw new IllegalStateException("No UTF-8");
                            }
                map.put(key, value);
            }
    
            return map;
    

    map 包含消息正文中包含的参数。

        2
  •  0
  •   matt b    16 年前

    我认为,如果请求日志将HTTP请求显示为GET,那么100个请求中有99个是真正发送GET的,而不是错误的日志。

    至于他们为什么会看到问题:我怀疑XML内容中的某些实体没有正确编码以进行传输,而且它们的XML解析在这些方面失败了-但是您还没有确切地指定 什么类型的问题 在Java端发生。