Xml 德尔福印地邮政错误501
我在尝试使用Indy将xml发布到web服务时遇到了一些问题 我的客户机是使用Indy 10.0.52的delphi类,我的api服务器是django tastypie。 我在服务器上的堆栈是: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
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;