Xml 德尔福印地邮政错误501

Xml 德尔福印地邮政错误501,xml,delphi,indy10,tastypie,Xml,Delphi,Indy10,Tastypie,我在尝试使用Indy将xml发布到web服务时遇到了一些问题 我的客户机是使用Indy 10.0.52的delphi类,我的api服务器是django tastypie。 我在服务器上的堆栈是: Django==1.5.1 defusedxml==0.4.1 django-tastypie==0.10.0 lxml==3.2.3 mimeparse==0.1.3 其他客户端(如plaincurl、python、js)正在毫无问题地发布到相同的资源。 例如: $ curl --dump-head

我在尝试使用Indy将xml发布到web服务时遇到了一些问题

我的客户机是使用Indy 10.0.52的delphi类,我的api服务器是django tastypie。 我在服务器上的堆栈是:

Django==1.5.1
defusedxml==0.4.1
django-tastypie==0.10.0
lxml==3.2.3
mimeparse==0.1.3
其他客户端(如plaincurl、python、js)正在毫无问题地发布到相同的资源。 例如:

$ curl --dump-header - -H "Content-Type: application/xml" -H "Authentication: Basic 875488" -k -X POST --data '<object>...</object>' https://www....object/?format=xml
HTTP/1.1 201 CREATED
Date: Tue, 19 Nov 2013 10:28:01 GMT
Server: Apache/2.2.14 (Ubuntu)
Access-Control-Allow-Headers: Origin,Authorization,Content-Type,Accept
Vary: Accept,Accept-Encoding
Location: https://www....object/12
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: POST,GET,OPTIONS,PUT,DELETE
Content-Length: 0
Content-Type: text/html; charset=utf-8
“http”是Indy TIdHTTP的成员实例


有人能告诉我我做错了什么吗?

在发布之前,您没有将流的
位置重置为0,您甚至没有发布XML流(您已将其注释掉)。您也没有考虑字符编码,也没有复制传递给curl的相同属性

试试这个:

procedure TRestObject.post( postURL:String; doc:IXMLDocument );
var
  aStream: TMemoryStream;
  data : TStringStream;
  xmlString : String;
begin
  aStream := TMemoryStream.Create;
  try
    http.HandleRedirects := True;
    http.ReadTimeout := 50000;
    // encoding
    xmlString := doc.XML.Text;
    ShowMessage(xmlString);
    data := TStringStream.Create(xmlString, TEncoding.UTF8);
    try
      http.Request.ContentType := 'application/xml';
      http.Request.Connection := 'close';
      try
        http.Post( postURL, data, aStream );
      except
        on E: EIdHTTPProtocolException do
          ShowMessage('Protocol Exception (HTTP status '+ IntToStr(E.ErrorCode) +'): ' + E.Message);
        on E: EIdSocketError do
          ShowMessage('Socket Error ('+ IntToStr(E.LastError) +'): ' + E.Message);
        on E: Exception do
          ShowMessage('Exception (class '+ E.ClassName +'): ' + E.Message);
      end;
    finally
      data.Free;
    end;
  finally
    aStream.Free;
  end;
end;

仍然不起作用。仍在获取501错误。。。将XML放入“数据”的方法是我做的第一次尝试之一。但它不起作用,这就是为什么我尝试使用stringstream。一篇帖子被注释(使用“data”的帖子),第二篇帖子是使用stringstream发送XML的帖子。身份验证参数在创建“http”成员对象的过程中提供,它可以工作,因为伴随方法“TRestObject.get”在同一服务器上工作。然后需要使用数据包嗅探器,例如Wireshark,要捕获curl和TIdHTTP的实际HTTP请求,请比较它们之间的差异,然后相应地更新您的TIdHTTP代码。您可能只是缺少属性设置,或者在某个地方设置了错误/格式错误的值。关于身份验证,您可能需要将相关的
IdAuthentication…
单元添加到
uses
子句中,以启用除基本身份验证以外的TIdHTTP身份验证方案,如NTLM。好的,答案501是由于内容编码错误造成的。。。谢谢大家。@Lex:谢谢你们的编辑!
procedure TRestObject.post( postURL:String; doc:IXMLDocument );
var
  aStream: TMemoryStream;
  data : TStringStream;
  xmlString : String;
begin
  aStream := TMemoryStream.Create;
  try
    http.HandleRedirects := True;
    http.ReadTimeout := 50000;
    // encoding
    xmlString := doc.XML.Text;
    ShowMessage(xmlString);
    data := TStringStream.Create(xmlString, TEncoding.UTF8);
    try
      http.Request.ContentType := 'application/xml';
      http.Request.Connection := 'close';
      try
        http.Post( postURL, data, aStream );
      except
        on E: EIdHTTPProtocolException do
          ShowMessage('Protocol Exception (HTTP status '+ IntToStr(E.ErrorCode) +'): ' + E.Message);
        on E: EIdSocketError do
          ShowMessage('Socket Error ('+ IntToStr(E.LastError) +'): ' + E.Message);
        on E: Exception do
          ShowMessage('Exception (class '+ E.ClassName +'): ' + E.Message);
      end;
    finally
      data.Free;
    end;
  finally
    aStream.Free;
  end;
end;