Я пытаюсь отправить файл XML с помощью метода TIdHTTP.Post()
.Я видел много примеров в вопросах здесь на сайте, но я не нашел ни одного подходящего для того, что я делаю.
Мне нужно сначала войти в веб-сервис, и он возвращает мне SessionID
иUserAuth
, а затем мне нужно отправить файл XML, используя эту информацию.
Вот как я это делаю:
var
IdHTTP : TIdHTTP;
params : TMemoryStream;
vResponse : TStringStream;
UserName, PassUser, URLogon, URSend, AuthUser: string;
jsonObj, jSubObj: TJSONObject;
begin
IdHTTP := TIdHTTP.Create;
vResponse := TStringStream.Create('');
params := TMemoryStream.Create;
UserName := '123456';
PassUser := '12345678';
AuthUser := string(EncodeBase64(AnsiString(UserName+':'+PassUser)));
URLogon := 'http://svchomologacao.sigen.cidasc.sc.gov.br/Acesso/Login?authToken=' + AuthUser;
URSend := 'http://svchomologacao.sigen.cidasc.sc.gov.br/Receituario/Incluir';
IdHTTP.Post(URLogon, params, vResponse);
Memo1.Lines.Add(vResponse.DataString);
//this is the return I get from WS, the SessionID and UserAuth in JSon:
jsonObj := TJsonObject.ParseJSONValue(vResponse.DataString) as TJsonObject; //Json conversion
params.LoadFromFile('D:\Exemple.xml');
IdHTTP.Request.CustomHeaders.Clear;
IdHTTP.Request.Clear;
IdHTTP.ConnectTimeout := 30000;
IdHTTP.Request.BasicAuthentication := True;
IdHTTP.Request.ContentType := 'application/xml';
IdHTTP.Request.ContentEncoding := 'raw';
IdHTTP.Request.Accept := 'application/xml';
IdHTTP.Response.CharSet := 'UTF-8';
IdHTTP.Request.UserAgent := 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; GTB5; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; Maxthon; InfoPath.1; .NET CLR 3.5.30729; .NET CLR 3.0.30618)';
IdHTTP.Request.CustomHeaders.AddValue(jsonObj.Get(0).JsonString.Value, jsonObj.Get(0).JsonValue.Value);
IdHTTP.Request.CustomHeaders.AddValue(jsonObj.Get(1).JsonString.Value, jsonObj.Get(1).JsonValue.Value);
IdHTTP.Post(URSend, params, vResponse);
ShowMessage(vResponse.DataString);
end;
Во втором POST я получаю ответ:
HTTP / 1.1 401 Unauthorized
Ниже приводится выдержка из документации:
URL-адрес, по которому можно увидеть описание услуг: https://svchomologacao.sigen.cidasc.sc.gov.br
, которыйуказывает на тестовую базу данных CIDASC, так что компании, предоставляющие ИТ-услуги для пестицидов, в дальнейшем именуемые EIS, могут интегрировать свои программы через веб-службы.
После того, как CIDASC одобрит интеграцию HIA, URL-адрес,для отправки официальных данных будут использоваться: http://sigensvc.cidasc.sc.gov.br
, где рецепты будут храниться в производственной базе данных CIDASC.
authToken - это комбинация (кодировать) в BASE64 (www.base64encode.org) и в UTF-8 - логин и пароль специалиста, выдавшего рецепт, разделенного двоеточием (:), как показано ниже:
например: professionaluser: professionalpass
FromExaНесколько выше, сгенерированный authToken будет выглядеть так::
svchomologacao.sigen.cidosc.sc.gov.br / Acesso / Login? AuthToken = xyz
где xyz будет токен, полученный на шаге 2.
Мыпомните, что этот метод является POST, поэтому он будет работать только через вызов, сделанный программным обеспечением, разрабатываемым EIS.Для тестирования могут использоваться существующие программы, такие как POSTMAN.
ОТПРАВИТЬ ПОЛУЧАТЕЛЕЙ В CIDASC После установления соединения с сервером EIS должен вызвать метод Include службы Receipt, чтобы отправить получателей, какпоказано ниже:
svchomologacao.sigen.cidasc.sc.gov.br / Receituario / Incluir
С этого момента система, разработанная EIS индивидуально, то есть передает первуюодин и ждет код ответа метода.
После изменения HTTPS это было так:
var
IdHTTP : TIdHTTP;
sshSocketHandler: TIdSSLIOHandlerSocketOpenSSL;
vResponse : TStringStream;
params : TMemoryStream;
begin
IdHTTP := TidHTTP.Create;
sshSocketHandler := TIdSSLIOHandlerSocketOpenSSL.Create(IdHTTP);
sshSocketHandler.SSLOptions.Method := sslvSSLv2;
IdHTTP.IOHandler := sshSocketHandler;
params := TMemoryStream.Create;
vResponse := TStringStream.Create('');
IdHTTP.Post('https://svchomologacao.sigen.cidasc.sc.gov.br/Acesso/Login?authToken=MzQ3MjA1Mzk2OjM4MjY1OTk5', params, vResponse);
Memo1.Lines.Add(vResponse.DataString);
Теперь я получаю ошибку:
10054 Сброс соединения по пиру
Я связался со службой поддержки по электронной почте, и они сказали мне, что данные UserAuth и SessionId должны быть отправлены в заголовочный файл cookie для вызова include, и отправилипример в C #:
public void InvokeService(string xml){
HttpWebRequest requestReceituarioCancelar = (
HttpWebRequest)WebRequest.CreateHttp(
@"https://svchomologacao.sigen.cidasc.sc.gov.br/Receituario/Cancelar"
);
requestReceituarioCancelar.Headers.Clear();
requestReceituarioCancelar.ContentType = "application/xml;charset=\"utf-8\"";
requestReceituarioCancelar.Accept = "application/xml";
requestReceituarioCancelar.Method = "POST";
XmlDocument SOAPReqBody = new XmlDocument();
//ServiceResult: contains the login return (SessionID and UserAuth)
var ServiceResult = StreamReceituarioLogin(requestLogin);
var uri = new Uri("https://svchomologacao.sigen.cidasc.sc.gov.br");
//Converts login return to json
var retorno = JsonConvert.DeserializeObject<StructCookie>(ServiceResult);
//In the CookieContainer add the Uri containing the URL, SessionID and UserAuth
requestReceituarioCancelar.CookieContainer = new CookieContainer();
requestReceituarioCancelar.CookieContainer.Add(uri, new Cookie("SessionID", retorno.SessionID));
requestReceituarioCancelar.CookieContainer.Add(uri, new Cookie("UserAuth", retorno.UserAuth));
SOAPReqBody.LoadXml(m);
//Now it sends the requestReceituarioCancelar and the SOAPReqBody containing the XML
Stream stream = null;
using (stream = requestReceituarioCancelar.GetRequestStream())
{
SOAPReqBody.Save(stream);
stream.Close();
}
using (WebResponse Serviceres = requestReceituarioCancelar.GetResponse())
{
using (StreamReader rd = new StreamReader(Serviceres.GetResponseStream()))
{
var ServiceResult = rd.ReadToEnd();
rd.Close();
}
}
}
Но я не мог сделать то же самое в Delphi.