Post by Davide APost by paolocarfiPost by Davide APost by paolocarfiPost by paolocarfiPost by Davide ASalve a tutti
COnnessione ad un server REST, con autenticazione OAuth2, scambio di richieste funziona correttamente, ma quando vado a fare l'ultima richiesta, nel quale dovrei trovare il pdf nel Raw ( che in effetti esiste nel response ) la chiamata di RestRequest.execute, genera l'errore "No Mapping for unicode Character exists in te target multi-bytre code page"
analizzando la unit REST.Client, il problema sembra esser alla riga 2948 : if LCharSet <> '' then LContentIsString := True
if LContentIsString then
LContent := FClient.HTTPClient.Response.ContentAsString(LEncoding);
per la quale si genera l'errore,
Può qualcuno indicarmi una soluzione a cui non riesco ad arrivare?
ho provato anche a fare una chiamata diretta http ( anche Indy ) ma ci sono difficoltà a passare le autorizzazione e i token, oppure l'utilizzo di SSL
Grazie
A spanne pare che, il problema dovrebbe essere nella risposta del server.
Per riuscire a capire necessita il codice del server che crea la risposta e i dati della risposta completi, incluse le intestazioni HTTP.
Grazie per l'interessamento ma, il server non è di mia competenza, ed ho scritto loro proprio perchè sembra che risponda come Charset=UTF8, ma loro hanno risposto che non settano nulla, anzi il content-Type come application/pdf, ma l'if (if LCharSet <> '' then LContentIsString := True ) della unit REST.Client, riporta a TRUE ...infatti è settato come UTF-8
prova a cambiare nella request
RESTRequest1.Client.FallbackCharsetEncoding := 'raw';
potrebbe funzionare
Grazie, Purtroppo NO
Client.HTTPClient.Response.CharSet (nella REST.Client unit) ritorna comunque UTF-8
ma come posso recompilare la unit ( REST.Client) ? così forzo Delphi?
Il messagio chi ricevi viene prodotto da errato encoding, questo è certo.
Il vero problema è capire cosa fai e cosa ti aspetti che avvenga.
Nessuno a detto che devi ricompilare la unit REST.Client. Ti invitavo ad aggiungere: (Il tuo componente di request).Client.FallbackCharsetEncoding := 'raw';
Si grazie, infatti il "PURTROPPO NO" si riferiva al fatto che avevo provato e NON ha cambiato l'esito.
Non condivido il fatto di "patchare" una UNIT nativa, ma sono fermo con questa problematica da oltre 2mesi e devo consegnare il prodotto
il codice .....
// Prima connessione richiesta TOKEN
RESTRequest1.Params.Clear;
RESTRequest1.AddParameter('grant_type', 'client_credentials', pkGETorPOST);
RESTRequest1.AddParameter('consumer_key','xxxxxxxxxxx', pkGETorPOST);
RESTRequest1.AddParameter('consumer_secret','xxxxx', pkGETorPOST);
RESTClient1.BaseURL := 'https://api.xxxxxx.com/';
// Richiesta
RESTRequest1.Method := rmPOST;
RESTRequest1.Resource := '/auth/token';
RESTRequest1.Execute;
// Estrai
jValue := RESTResponse1.JSONValue;
edToken.Text := jValue.GetValue<string>('access_token');
// Imposta TOKEN su REST Client e OAuth2
OAuth2Authenticator1.AccessTokenParamName := 'access_token';
OAuth2Authenticator1.AccessToken := edToken.Text;
OAuth2Authenticator1.TokenType := TOAuth2TokenType.ttBEARER;
RESTClient1.Authenticator := OAuth2Authenticator1;
// Richiedo pdf
RESTRequest1.Params.Clear;
OAuth2Authenticator1.AccessTokenParamName := 'attachment_token';
// 'access_token';
OAuth2Authenticator1.AccessToken := edTmpToken.Text;
RESTRequest1.Method := rmGET;
RESTRequest1.Resource := '/attachments/' + edTmpId.Text; // id Entity
RESTClient1.ContentType := 'ctAPPLICATION_PDF';
RESTRequest1.Client.FallbackCharsetEncoding := 'raw';
RESTRequest1.Accept := 'application/pdf';
\\RESTRequest1.AcceptCharset := 'UTF-8';
try
RESTRequest1.Execute;
finally
nSize := length( RESTResponse1.RawBytes ); // nSize := length(RESTRequest1.Response.RawBytes);
if nSize > 0 then begin
TFile.WriteAllBytes( EarLogFileName('pdf'), RESTResponse1.RawBytes);
meLog.Lines.Append(EarBytesToStr(nSize) + ' download');
end
else meLog.Lines.Append('Zero Bytes download');
end;
La risposta dell'azienda del server:
abbiamo verificato la chiamata per lo scarico del PDF, a noi non risulta che venga indicato il Charset=UTF-8, è possibile che venga inserito dal vostro applicativo?
In ogni caso, il file che viene inviato è un PDF in binario , qui di seguito potete trovare l’header della risposta di una richiesta di scarico PDF:
...riporto a mano le info di interesse..:
Content-Type : application/pdf
Content-Length : 101556
Content-Disposition : attachment;filename="asas.pdf"
Content-Encoding : gzip
Vary : Origin