2014-11-25 52 views
-1

使用德爾福2007年, 利用Indy 10, 使用TIdWebDAV, 服務webdav.yandex.ru, 我要發佈一個文件,但我得到一個錯誤的授權德爾福TIdWebDav Yandex的

procedure TForm2.Button1Click(Sender: TObject); 
Var 
s, r: TStringStream; 
begin 
    s := TStringStream.Create('<propertyupdate xmlns="DAV:">' + sLineBreak + 
    '<set>' + sLineBreak + 
    '<prop>' + sLineBreak + 
     '<public_url xmlns="urn:yandex:disk:meta">true</public_url>' + sLineBreak + 
    '</prop>' + sLineBreak + 
    '</set>' + sLineBreak + 
'</propertyupdate>'); 

    r := TStringStream.Create(''); 
    try 
//fill params 
    IdWebDAV1.URL.Password := '*****'; 
    IdWebDAV1.URL.Username := '***@yandex.ru'; 
    IdWebDAV1.URL.Port := '80'; 
    IdWebDAV1.URL.URI := '/tst/readme.txt'; 
    IdWebDAV1.URL.Host := 'webdav.yandex.ru'; 
    IdWebDAV1.URL.Protocol := 'PROPFIND'; 

//fill OAuth ID 
    IdWebDAV1.Request.CustomHeaders.Add('Authorization: OAuth c953e33d6ec14895aa776f55145e73b5'); 
    IdWebDAV1.Put('https://webdav.yandex.ru/', s, r); 
//result 
    Memo1.Lines.Text := r.DataString; 
    finally 
    s.Free; 
    r.Free; 
    end; 
end; 

我得到一個錯誤:HTTP/1.1 401 Unauthorized。

回答

1

您沒有正確使用TIdWebDAV。在發佈propertyupdate XML時,您應該使用DAVPropPatch()方法而不是其Put()方法,並且根本不應手動填寫URI屬性。

試試這個:

procedure TForm2.Button1Click(Sender: TObject); 
var 
    q: TStringStream; 
    r: TMemoryStream; 
begin 
    q := TStringStream.Create(
    '<propertyupdate xmlns="DAV:">' + sLineBreak + 
    '<set>' + sLineBreak + 
    '<prop>' + sLineBreak + 
    '<public_url xmlns="urn:yandex:disk:meta">true</public_url>' + sLineBreak + 
    '</prop>' + sLineBreak + 
    '</set>' + sLineBreak + 
    '</propertyupdate>' 
); 
    try  
    r := TMemoryStream.Create; 
    try 
     IdWebDAV1.Request.Username := '***@yandex.ru'; 
     IdWebDAV1.Request.Password := '*****'; 
     IdWebDAV1.Request.ContentType := 'text/xml'; 
     IdWebDAV1.Request.Charset := 'utf-8'; 
     IdWebDAV1.Request.CustomHeaders.Values['Authorization'] := 'OAuth c953e33d6ec14895aa776f55145e73b5'; 
     IdWebDAV1.Request.BasicAuthentication := False; 
     IdWebDAV1.DAVPropPatch('https://webdav.yandex.ru/tst/readme.txt', q, r); 
     r.Position := 0; 
     Memo1.Lines.Text := ReadStringAsCharset(r, IdWebDAV1.Response.Charset); 
    finally 
     r.Free; 
    end; 
    finally 
    q.Free; 
    end; 
end; 
+0

謝謝!只有沒有用戶名和密碼 – Akella225 2014-11-27 07:06:14