我使用TidHTTP.Post将JSON发送到一个安静的服务但是在发生HTTP错误400时无法从idHTTP读取响应。当400发生时,服务器提供JSON,其描述正在发送的数据中的错误。我有时会得到可读的JSON结果,但大多数时候响应只包含几个不可打印的字符。
procedure TForm1.SendData(const stlACSchedule: TStringList; BatchTimeIn: TDateTime);
var
TargetURL : String;
stsJson: TStringStream;
myResponse : String;
resp : TMemoryStream;
begin
TargetURL := 'http://sandbox.xxxxxxxxxxx.com/api/v1/feeds' ;
stsJson := TStringStream.Create;
stsJson.WriteString(stlACSchedule.Text);
resp := TMemoryStream.Create;
application.ProcessMessages;
try
myResponse := IdHTTP1.Post( TargetURL, stsJson );
WriteStatus( 'Response from Vendor Server: ' );
UpdateUploadStatus2( IdHTTP1.ResponseCode, IdHttp1.ResponseText, BatchTimeIn, 'usPending', 'usUploaded' );
except
on E: EIdHTTPProtocolException do begin
WriteStatus( 'HTTP Protocol Error from Vendor Server: ' + #13 + E.ErrorMessage + ' -*- ' + IdHTTP1.ResponseText );
UpdateUploadStatus2( IdHTTP1.ResponseCode, E.ErrorMessage + ' - ' + IdHTTP1.ResponseText, BatchTimeIn, 'usPending', 'usBatchFail' );
ShowMessage('Fubar_!: ' + myResponse);
end;
on E: Exception do begin
WriteStatus( 'Unknown Error from Vendor Server:' );
UpdateUploadStatus2( IdHTTP1.ResponseCode, E.Message + ' - ' + IdHTTP1.ResponseText, BatchTimeIn, 'usPending', 'usBatchFail' );
ShowMessage('Fubar!: ' + myResponse);
end;
end;
resp.free;
stsJson.free;
end; { SendData }
procedure TForm1.WriteStatus(strTextIn : String);
begin
Memo1.Lines.add('');
Memo1.Lines.add(strTextIn);
Memo1.Lines.add(IntToStr(IdHTTP1.ResponseCode));
Memo1.Lines.add(IdHTTP1.ResponseText);
end; { WriteStatus }
似乎EIdHTTPProtocolException异常处理程序正在捕获错误,但大多数时候我得到这样的响应(#34下面有3个不可打印的字符;供应商服务器"行中的HTTP协议错误):
HTTP Protocol Error from Vendor Server:
400
HTTP/1.1 400 Bad Request
但偶尔我得到一个很好的回应,就像这样:
HTTP Protocol Error from ReturnJet Server:
{"errors":[{"code":7,"message":"Invalid departure or destination type for event: 1"}]} -*- HTTP/1.1 400 Bad Request
400
HTTP/1.1 400 Bad Request
看起来它可能有一些事情要做,但响应时间长,但我不确定。
我需要做些什么来持续解码ResponseText?
我正在使用:Delphi XE8,Indy ver 10.6
PS - 当我使用Postman手动发布此数据时,我总是得到完整的JSON响应。
TIA
答案 0 :(得分:0)
400
响应是错误响应。默认情况下,TIdHTTP
会在发生HTTP错误时引发EIdHTTPProtocolException
异常(除非您要求不这样做),其中HTTP响应头在TIdHTTP.Response
属性中可用,并且HTTP响应内容在异常string
属性中以ErrorMessage
的形式提供,以免损坏TStream
用于输出的内容(除非您要求)。
如果异常' ErrorMessage
不包含您期望的JSON,则服务器不会开始发送JSON,或者不以Indy可以解码的格式传输JSON到string
。但是你没有显示实际的HTTP响应是什么样的,或者是什么" 3不可打印的字符"实际上是,所以没有办法确定为什么ErrorMessage
没有像你期望的那样被填充。
答案 1 :(得分:0)
您必须更改IdHTTP上的某些选项,才能获得与在浏览器或诸如Postman之类的程序上获得的响应相同的响应。
使用:
IdHTTP1.HTTPOptions := idHTTP1.HTTPOptions + [hoNoProtocolErrorException, hoWantProtocolErrorContent];