Delphi TIdWebDav Yandex

Delphi TIdWebDav Yandex,delphi,indy,webdav,Delphi,Indy,Webdav,使用Delphi2007, 使用InDy 10, 使用TIdWebDAV, 服务webdav.yandex.ru, 我想发布一个文件,但我得到了一个错误授权 procedure TForm2.Button1Click(Sender: TObject); Var s, r: TStringStream; begin s := TStringStream.Create('<propertyupdate xmlns="DAV:">' + sLineBreak + '<set

使用Delphi2007, 使用InDy 10, 使用TIdWebDAV, 服务webdav.yandex.ru, 我想发布一个文件,但我得到了一个错误授权

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;
procedure TForm2.按钮1单击(发送方:TObject);
变量
s、 r:TStringStream;
开始
s:=TStringStream.Create(“”+sLineBreak+
''+sLineBreak+
''+sLineBreak+
“真的”+sLineBreak+
''+sLineBreak+
''+sLineBreak+
'');
r:=TStringStream.Create(“”);
尝试
//填充参数
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”;
//填写OAuth ID
IdWebDAV1.Request.CustomHeaders.Add('Authorization:OAuth c953e33d6ec14895aa776f55145e73b5');
IdWebDAV1.Put('https://webdav.yandex.ru/",s,r),;
//结果
Memo1.Lines.Text:=r.DataString;
最后
s、 免费的;
r、 免费的;
结束;
结束;

我收到一个错误:HTTP/1.1 401未经授权。

您没有正确使用
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;
procedure TForm2.按钮1单击(发送方:TObject);
变量
q:TStringStream;
r:TMemoryStream;
开始
q:=TStringStream.Create(
''+sLineBreak+
''+sLineBreak+
''+sLineBreak+
“真的”+sLineBreak+
''+sLineBreak+
''+sLineBreak+
''
);
尝试
r:=TMemoryStream.Create;
尝试
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、 位置:=0;
Memo1.Lines.Text:=ReadStringAsCharset(r,IdWebDAV1.Response.Charset);
最后
r、 免费的;
结束;
最后
q、 免费的;
结束;
结束;