WebDAV с J2ME - PullRequest
       20

WebDAV с J2ME

1 голос
/ 04 апреля 2009

Есть ли способ использовать WebDAV с J2ME (некоторые библиотеки или ручное кодирование)?

Я пробовал:
- javax.microedition.io.HttpConnection , но метод «ПОИСК» там не поддерживается
- javax.microedition.io.SocketConnection с запрос Http - в ответ ничего не возвращается
Возможно, что-то не так с моим кодом или заголовком 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 ]

4 голосов
/ 04 апреля 2009

Что вы подразумеваете под «ничего не возвращается»? Нет ответа тела? Нет кода статуса?

Рекомендую отслеживать, что происходит на «проводе» ...

ОБНОВЛЕНИЕ: вы пытались добавить заголовок хоста?

2 голосов
/ 04 апреля 2009

Джулиан +1 ты был прав на собственность хозяина, QRSO +1, спасибо всем! Таким образом,
- Я нашел бесплатный сервис WebDAV MyDisk.se (ПОИСК не разрешен, поэтому я использовал PROPFIND)
- использовал WFetch для игры с WebDAV-запросом
- использовал Сетевой монитор для сравнения запросов от 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();
1 голос
/ 04 апреля 2009

К вашему сведению Если вы проводите тестирование на реальном мобильном телефоне, вполне вероятно, что ваш оператор мобильной связи может блокировать не HTTP-трафик.

Сначала вы можете проверить, можете ли вы сначала отправлять запросы GET и POST на сервер.

...