Results 1 to 5 of 5

Thread: HTTP POST Wininet

  1. #1

    HTTP POST Wininet

    Ik doe een HTTPS Post met WinInet:

    Delphi Code:
    1. var
    2.   hInet : HINTERNET;
    3.   hHTTP : HINTERNET;
    4.   hReq  : HINTERNET;
    5.   BData : AnsiString;
    6. const
    7.   Accept: packed array[0..1] of LPWSTR = (PChar('*/*'), nil);
    8.   Header: string = 'Content-Type: ' + ContentType;
    9. begin
    10.   Result := True;
    11.   hInet  := InternetOpen(UserAgent, INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
    12.   try
    13.     hHTTP := InternetConnect(hInet, BaseHost, INTERNET_DEFAULT_HTTPS_PORT, nil, nil, INTERNET_SERVICE_HTTP, 0, 1);
    14.     try
    15.       hReq := HttpOpenRequest(hHTTP, PChar('POST'), PChar(APath), nil, nil, @Accept, INTERNET_FLAG_KEEP_CONNECTION OR INTERNET_FLAG_NO_CACHE_WRITE OR INTERNET_FLAG_RELOAD or INTERNET_FLAG_SECURE, 1);
    16.       try
    17.         if not HttpSendRequest(hReq, PChar(Header), Length(Header), PChar(BData), Length(BData)) then
    18.           Result := False;
    19.       finally
    20.         InternetCloseHandle(hReq);
    21.       end;
    22.     finally
    23.       InternetCloseHandle(hHTTP);
    24.     end;
    25.   finally
    26.     InternetCloseHandle(hInet);
    27.   end;
    28. end;

    Gaat allemaal prima, maar hij hakt af op 1024 bytes.. En ik snap niet waarom? Iemand die weet hoe dit op te lossen is? Ik weet dat bovenstaand enkel post (niet de data die de server terug geeft ook ophaalt), maar dat is voor mij ook niet belangrijk omdat het in een klein programma zit dat enkel wat data hoeft door te sturen. Nu is alleen als ik een JSON string heb - langer dan 1024 karakters (ANSI) dan hakt hij nog altijd af op 1024 tekens..

    Code:
    POST https://app.mysite.xx/plugin HTTP/1.1
    Content-Type: application/json
    User-Agent: MyAwesomeUseragent
    Host: app.mysite.xx
    Content-Length: 1024
    Connection: Keep-Alive
    Cache-Control: no-cache

  2. #2
    Ik snap je code niet helemaal. Je gebruikt een lokale variabele, BData, die nooit geinitialiseerd wordt...
    1+1=b

  3. #3
    BData is een base64 encoded string. Ik heb die er uit gelaten omdat ik dacht dat het niet belangrijk was - maar goed met die erin ziet het er zo uit:
    Delphi Code:
    1. var
    2.   hInet : HINTERNET;
    3.   hHTTP : HINTERNET;
    4.   hReq  : HINTERNET;
    5.   BData : AnsiString;
    6. const
    7.   Accept: packed array[0..1] of LPWSTR = (PChar('*/*'), nil);
    8.   Header: string = 'Content-Type: ' + ContentType;
    9. begin
    10.   Result := True;
    11.   BData  := B64Enc(AData);
    12.   hInet  := InternetOpen(UserAgent, INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
    13.   try
    14.     hHTTP := InternetConnect(hInet, BaseHost, INTERNET_DEFAULT_HTTPS_PORT, nil, nil, INTERNET_SERVICE_HTTP, 0, 1);
    15.     try
    16.       hReq := HttpOpenRequest(hHTTP, PChar('POST'), PChar(APath), nil, nil, @Accept, INTERNET_FLAG_KEEP_CONNECTION OR INTERNET_FLAG_NO_CACHE_WRITE OR INTERNET_FLAG_RELOAD or INTERNET_FLAG_SECURE, 1);
    17.       try
    18.         if not HttpSendRequest(hReq, PChar(Header), Length(Header), PChar(BData), Length(BData)) then
    19.           Result := False;
    20.       finally
    21.         InternetCloseHandle(hReq);
    22.       end;
    23.     finally
    24.       InternetCloseHandle(hHTTP);
    25.     end;
    26.   finally
    27.     InternetCloseHandle(hInet);
    28.   end;
    29. end;

  4. #4
    Als je expliciet ansistring gebruikt, zit je dan op een unicode versie van Delphi? Zo ja, moet je BData dan wel naar PChar casten? Misschien beter naar PAnsiChar en/of explicit HttpSendRequestA aanroepen. Of geen ansistring gebruiken. Tevens, beter om Length(BData) * SizeOf(Char) te doen. Dat is noodzakelijk om de juistte grootte te krijgen in Delphi 2009+
    1+1=b

  5. #5
    Heb je raad opgevolgd, door PAnsiChar te gebruiken. Ik wou eerst UTF8 gebruiken, maar omdat ik werk met dll's die en ansi en (delphi) widestring gebruiken - heb ik het gehouden op ansisstring omdat er toch enkel bestaat uit JSON strings, met de unicode characters dus al netjes geescaped.

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •