Delphi 7 i Synapse. Synapse dodaje zbędne dla mnie nagłówki.

0

Chcę wysłać przez synapse dokładnie te i tylko te nagłowki w poscie.:

(Request-Line):POST /RangesAndPorts.asmx HTTP/1.1
Content-Type:text/xml; charset=utf-8
SOAPAction:"http://iptv-backend.apphb.com/GetData"
Host:iptv-backend.apphb.com
Expect:100-continue
Connection:Keep-Alive
Accept-Encoding:gzip, deflate
Content-Length:262

post jest taki:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body><GetData xmlns="http://iptv-backend.apphb.com/" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><ip>IP</ip><port>80</port><source>pf1.18</source></GetData></s:Body></s:Envelope>

Tam jest znak '=' i mi rozdziela na 2.

Synapse dodaje mi drugie contnent-type i user-agenta. Da się to zrobić?

0

Na przykład podać kod, bo na pewno coś robisz źle ale szklana kula nie wiem jak innym ale mi się popsuła.

0
function StreamToStr(AStream : TMemoryStream) : string;
begin
  Result := '';
  if AStream.Size > 0 then
  begin
    SetLength(Result, AStream.Size);
    AStream.Read(PChar(Result)^, Length(Result));
    Result := UTF8ToAnsi(Result);
  end;
end;

procedure post();
var
  DocStr : string;
  data : String;
  IP, PORT : string;
  Base_Url : string;
  SynHttp : THTTPSend;
begin
  Base_Url := 'http://iptv-backend.apphb.com/RangesAndPorts.asmx';

    IP := '89.66.193.3';
    PORT := '80';

      with SynHttp do
      begin
        data := '<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body><GetData xmlns="http://iptv-backend.apphb.com/" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><ip>'+IP+'</ip><port>'+PORT+'</port><source>pf1.18</source></GetData></s:Body></s:Envelope>';

        //MimeType := 'text/xml;charset=utf-8';
        Protocol := '1.1';
        KeepAlive := True;
        //UserAgent := 'Mozilla/5.0';
        Headers.Add('SOAPAction:"http://iptv-backend.apphb.com/GetData"');
        Headers.Add('Expect:100-continue');
        Headers.Add('Accept-Encoding:gzip,deflate');
        Headers.Add('Host:iptv-backend.apphb.com');
        Headers.Add('Content-Type:text/xml;charset=utf-8');

        Document.Write(Pointer(data)^, Length(data));

        HTTPMethod('POST',Base_Url);
        DocStr := StreamToStr(Document);
        Form1.Memo1.Text := DocStr;
      end;
  SynHttp.Free;
end;

0

Nagłówki są wysyłane poprawnie (dokładnie takie jakie chcesz) a odpowiedź serwera HTTP Error 400. The request has an invalid header name. może być myląca najprawdopodobniej chodzi o ciastka (czyli brakuje nagłówka), które prawdopodobnie powinny być ustawione przy logowaniu nie wiem co robisz ale zakładam, że było logowanie.

0

W tym przypadku się nie loguje. W pythonie wszystko działa. Powinno porać xml.
Może dac User-Agenta na ''? Mogę dać funkcję w pythonie, jeśli trzeba. Po prostu chcę przenieś z pythona na synapse.

Python 2.7

0

Tak jak poniżej działa zapytanie jest poprawna odpowiedź ale jako GZIP (jak zapiszesz stream odp. jako plik.gz to widać że odp jest poprawna) a nie wiem jak w Delphi 7 obsłużyć tą kompresję przy użyciu Synapse a nie mam czasu do tego dochodzić. W każdym razie dodanie nagłówka Accept-Encoding:identity, który powinien spowodować aby serwer wysyłał odpowiedź jako czysty tekst nic nie daje.

procedure post();
var
  DocStr : string;
  data : String;
  IP, PORT : string;
  Base_Url : string;
  SynHttp : THTTPSend;
begin
   Base_Url := 'http://iptv-backend.apphb.com/RangesAndPorts.asmx';

    IP := '89.66.193.3';
    PORT := '80';

  SynHttp:= THTTPSend.Create;

  with SynHttp do
  begin
    data := '<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body><GetData xmlns="http://iptv-backend.apphb.com/" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><ip>'+IP+'</ip><port>'+PORT+'</port><source>pf1.18</source></GetData></s:Body></s:Envelope>';

    Protocol := '1.1';
    KeepAlive := True;
    UserAgent := 'python-requests/2.20.0';
    SynHttp.MimeType:= 'text/xml;charset=utf-8';
    Headers.Add('SOAPAction:http://iptv-backend.apphb.com/GetData');
    Headers.Add('Expect:100-continue');
    Headers.Add('Accept-Encoding:gzip,deflate');
    Headers.Add('Host:iptv-backend.apphb.com');

    Document.Write(Pointer(data)^, Length(data));

    HTTPMethod('POST',Base_Url);

    DocStr := StreamToStr(Document);
    Form1.Memo1.Text := DocStr;
  end;
  SynHttp.Free;
end;

Musisz sobie znaleźć jak w Synapse obsłużyć GZip albo z Synapse przejść na Indy, które (przynajmniej wersji 10.X w Delphi 7 domyślnie jest Indy 9 ale można wywalić i zainstalować 10) sobie bez problemu z tym radzi.

0

Już mam. Dzięki za poświęcony czas.

procedure post();
var
  DocStr : string;
  data : String;
  IP, PORT : string;
  Base_Url : string;
  SynHttp : THTTPSend;
begin
  Base_Url := 'http://iptv-backend.apphb.com/RangesAndPorts.asmx';

    IP := '89.66.193.3';
    PORT := '80';

    SynHttp := THttpSend.Create;

      with SynHttp do
      begin
        data := DecodeUrl(EncodeUrlElement('<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body><GetData xmlns="http://iptv-backend.apphb.com/" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><ip>'+IP+'</ip><port>'+PORT+'</port><source>pf1.18</source></GetData></s:Body></s:Envelope>'));

        MimeType := 'text/xml;charset=utf-8';
        UserAgent := '';
        Headers.Add('SOAPAction:http://iptv-backend.apphb.com/GetData');
        Headers.Add('Expect:100-continue');
        Headers.Add('Accept-Encoding:xml,deflate');
        Headers.Add('Connection:Keep-Alive');

        Document.Write(Pointer(data)^, Length(data));

        HTTPMethod('POST',Base_Url);
        DocStr := StreamToStr(Document);
        Document.SaveToFile('a.txt');
        Form1.Memo1.Text := DocStr;
      end;
  SynHttp.Free;
end;

Może moderator zakończyć wątek, bo nie wiem jak.

1 użytkowników online, w tym zalogowanych: 0, gości: 1