代码之家  ›  专栏  ›  技术社区  ›  Maksym Gontar

带J2ME的WebDAV

  •  1
  • Maksym Gontar  · 技术社区  · 15 年前

    有没有一种将WebDAV与J2ME结合使用的方法(一些库或手工编码)?

    我试过了:
    - javax.microedition.io.HttpConnection ,但不支持“search”方法
    - javax.microedition.io.SocketConnection 具有 Http request -没有任何响应返回
    可能我的代码或HTTP头有问题:

        String response = "";
        String query = "<?xml version='1.0'?> " 
                + "<g:searchrequest xmlns:g='DAV:'> "
                + "<g:sql> "
                + "SELECT 'DAV:displayname' "
                + "FROM 'http://exchangeserver.com/Public/' "
                + "</g:sql> "
                + "</g:searchrequest> ";
        String len = String.valueOf(query.length());
        SocketConnection hc = (SocketConnection) Connector
                .open("socket://exchangeserver.com:8080");
        DataOutputStream dout = 
                new DataOutputStream(hc.openOutputStream());
        DataInputStream din = new DataInputStream(hc.openInputStream());
        String userPass = "username" + ":" + "password";
        byte[] encoded = 
                Base64OutputStream.encode(userPass.getBytes(), 0,
                userPass.length(), false, false);
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        String request = "SEARCH /Public/ HTTP/1.1\r\n"
                +"Content-Type:text/xml\r\nContent-Length:"
                + len
                + "\r\nAuthorization:Basic "
                + new String(encoded)
                + "\r\n\r\n";
        bos.write(request.getBytes());
        bos.write(query.getBytes());
        dout.write(bos.toByteArray());
        dout.flush();
        dout.close();
        byte[] bs = new byte[900];
        din.readFully(bs);
        bos = new ByteArrayOutputStream();
        bos.write(bs);
        din.close();
        hc.close();
        response = bos.toString();
    
    3 回复  |  直到 13 年前
        1
  •  4
  •   Julian Reschke    15 年前

    你说“没有回报”是什么意思?没有反应体?没有状态代码?

    我建议追踪“电线”上发生的事情…

    更新:是否尝试添加主机头?

        2
  •  2
  •   Maksym Gontar    15 年前

    朱利安+1你是主人的财产,qrso+1,感谢所有人! 所以,
    -我找到了免费的WebDAV服务 MyDisk.se (不允许搜索,所以我使用propfind)
    -使用 WFetch 玩转WebDAV请求
    -使用 Network Monitor 比较来自wfetch和我的应用程序的请求。
    :)终于成功了! 结果代码:

    String response = "";
    String query = "<?xml version='1.0' encoding='UTF-8'?>\r\n"
            + "<d:propfind xmlns:d='DAV:'>\r\n"
            + "<d:prop><d:getcontenttype/></d:prop>\r\n"
            + "<d:prop><d:getcontentlength/></d:prop>\r\n"
            + "</d:propfind>\r\n";
    
    String len = String.valueOf(query.length());
    SocketConnection hc = (SocketConnection) Connector
            .open("socket://79.99.7.153:80");
    DataOutputStream dout = new DataOutputStream(hc.openOutputStream());
    DataInputStream din = new DataInputStream(hc.openInputStream());
    String userPass = "login" + ":" + "password";
    byte[] encoded = Base64OutputStream.encode(userPass.getBytes(), 0,
            userPass.length(), false, false);
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    String request = "PROPFIND /mgontar/ HTTP/1.1\r\n" 
            + "Depth: 1\r\n"
            + "Host: mydisk.se:80\r\n" 
            + "Accept: */*\r\n"
            + "Content-Type: text/xml\r\n" 
            + "Content-Length: " + len
            + "\r\nAuthorization: Basic " + new String(encoded)
            + "\r\n\r\n";
    bos.write(request.getBytes());
    bos.write(query.getBytes());
    dout.write(bos.toByteArray());
    dout.flush();
    dout.close();
    byte[] bs = new byte[900];
    din.readFully(bs);
    bos = new ByteArrayOutputStream();
    bos.write(bs);
    din.close();
    hc.close();
    response = bos.toString();
    
        3
  •  1
  •   michael aubert    15 年前

    仅供参考,如果您正在测试实际的移动电话,那么您的移动网络运营商很可能会阻止非HTTP流量。

    您可能需要首先检查是否可以向服务器发出GET和POST请求。