Wątek przeniesiony 2023-06-26 09:48 z Nietuzinkowe tematy przez Riddle.

Jak wyłączyć kodowanie w żądaniu?

0

Po wysłaniu batch/Upload dostaję "Nieprawidłowy rozmiar części pakietu.".
Skrót Base64 jest

0ER7+83+h6FT142XwOJ87CaY18kopo6JM1PPTO4N1Kg=

a Fidler pokazuje, że wysłane zostało

Content-SHA256: 0ER7%2B83%2Bh6FT142XwOJ87CaY18kopo6JM1PPTO4N1Kg%3D

I to jest chyba przyczyna - encoding, ale jak to wyłączyć ?
Używam Delphi 10.2 Professional i REST.
TRESTRequest ma AcceptEncoding:string
ale w kodzie źródłowym ani w Internecie nie mogę znaleźć jasnej odpowiedzi.
Bardzo proszę o podpowiedź.

1

Radziłbym dostarczyć Minimalny Kompletny Reprodukowany Przykład.

Pogrzebałem trochę w doumentacji TRESTRequest.
Coś strasznie ktoś przekombinował projektuyjąc API i to wygląda mi to na faktyczny bug tej biblioteki.
Zakładając, że użyłeś AddParameter(const AName, AValue: string); radziłbym spróbować dodać trzeci argument TRESTRequestParameterKind.pkHTTPHEADER.

0
MarekR22 napisał(a):

Wygląda prawidłowo.
W nagłówkach http nie może wystąpić znak + (tak jak parę innych znaków) ergo musi być zakodowany jako %2B.
Tak samo =.

To mi wygląda na problem XY. Z czym właściwie masz problem. Jakie są faktycznie objawy, a nie twoja diagnoza.

Wysyłam fakturę do KSeF operacją batch/Uplad.
Tam trzeba wysłać skrót tej faktury zakodowany Base64:

0ER7+83+h6FT142XwOJ87CaY18kopo6JM1PPTO4N1Kg=

W Delphi REST wygląda to tak:

RRequest.ResetToDefaults;
RRequest.Method:=rmPut;
RRequest.Resource:='batch/Upload/'+ref+'/'+partName;
RRequest.Accept:='application/json';
RRequest.Params.AddHeader('Content-SHA256',skrot);
RRequest.Params.AddHeader('X-TargetSrv-Name',serwer);
RRequest.AddBody(faktura,trestcontenttype.ctAPPLICATION_OCTET_STREAM);
RRequest.Execute;

Podejrzałem Fidler-em, jak to jest wysyłane z Delphi

PUT https://ksef-test.mf.gov.pl/api/batch/Upload/20230626-SE-69A1E9F62B-ED755DBB0B-EB/20230626-EA-6181199816-45B3D116F9-3D HTTP/1.1
Connection: Keep-Alive
Content-Type: application/octet-stream
Accept: application/json
Accept-Charset: UTF-8, *;q=0.8
User-Agent: Embarcadero RESTClient/1.0
Content-SHA256: 0ER7%2B83%2Bh6FT142XwOJ87CaY18kopo6JM1PPTO4N1Kg%3D
X-TargetSrv-Name: srvTEMFA
Content-Length: 1408
Host: ksef-test.mf.gov.pl

KSeF tego nie przyjął. Dostałem odpowiedź "Nieprawidłowy rozmiar części pakietu.".
Pomyślałem, że może przyczyną jest ta zamiana + na %2B.

0

@MarekR22: Zrobiłem, jak zaleciłeś:

RRequest.ResetToDefaults;
RRequest.Method:=rmPut;
RRequest.Resource:='batch/Upload/'+ref+'/'+partName;
RRequest.Accept:='application/json';
RRequest.AddParameter('Content-SHA256',skrot,TRESTRequestParameterKind.pkHTTPHEADER);
RRequest.AddParameter('X-TargetSrv-Name',serwer,TRESTRequestParameterKind.pkHTTPHEADER);
RRequest.AddBody(zms,trestcontenttype.ctAPPLICATION_OCTET_STREAM);
RRequest.Execute;

Ale nic to nie zmieniło. Delphi zamienia + na %2B. KSeF daje komunikat "Nieprawidłowy rozmiar części pakietu.".
Na wątku KSeF widziałem uwagi, że w Delphi trzeba wyłączyć encoding, ale do tej pory nikt mi nie odpowiedział,
jak się to robi.
Z drugiej strony, zaczynam się zastanawiać, czemu KSeF nie dał komunikatu np. "Nieprawidłowy skrót".
Może KSeF rozumie, że %2B trzeba sobie zamienić na +, a przyczyna błędu jest inna ?

2

Powinno działać

RESTRequest1.AddParameter('Content-SHA256', skrot, TRESTRequestParameterKind.pkHTTPHEADER, [TRESTRequestParameterOption.poDoNotEncode]);

i to żaden bug ale jak najbardziej poprawne działanie.

0

@kAzek: Dziękuję bardzo. Zadziałało,
czyli Fidler pokazuje skrót dokładnie taki jak wygenerowałem,
ale dalej mam błąd "Nieprawidłowy rozmiar części pakietu.".
Krok do przodu zrobiony i trzeba brnąć dalej.

1

No bo to base64 po zdekodowaniu nawet nie przypominam mi sha256. Jak nie masz pewności czy poprawnie zakodowałeś (a wątpię czy to jest poprawnie) spróbuj wygenerować poprawny https://www.devglan.com/online-tools/hmac-sha256-online tam masz też opcję aby zrobił od razu base64 (jeżeli tak ma być).

0

@kAzek: Dekodowałem
0ER7+83+h6FT142XwOJ87CaY18kopo6JM1PPTO4N1Kg=
w swoim programie i w kilku różnych dekoderach Base64 online.
Zawsze dostaję poniższy wynik (trzeba tylko wybrać Windows-1252 lub cp1252).
ÐD{ûÍþ‡¡S×—Àâ|ì&˜×É(¦Ž‰3SÏLî Ô¨
Nie jestem "orłem" w tych tematach, ale nie wydaje mi się, żeby to nie mogło być skrótem SHA-256.
Oczywiście, komputer próbuje pokazywać coś, czego nie da się pokazać tekstem.
Łączy po 8 bitów w bajt i pokazuje znak odpowiadający z Windows-1252.
Dlatego widać 256/8=32 jakieś znaki.
Gdyby podzielić to po 4 bity i zapisać szesnastkowo, wyglądałoby całkiem dobrze.
Na tym linku, który podałeś, trzeba podać "Secret Key" - nie wiem o co chodzi.

1

Chodzi o to, że raczej to powinny być kody znaków hex np. coś w stylu d0a50a5ea8fd7fe04d6dcbae72167423d1e82895fc7b797b5c8fd625de707bb8 (i dopiero to prawdopodobnie zakodowane base64) ale w sumie trudno powioedzieć czego dana strona oczekuje ale w życiu nie widziałem aby to powinno być czystym tekstem zakodowanym base64.

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