Sto correndo anche in questo problema. Sembra essere limitato all'interfaccia COM WinHttp.WinHttpRequest
. Ci sono un paio di opzioni diverse per risolvere questo.
Dopo alcuni scavi, ho trovato this post da un dipendente Microsoft. Fornisce una spiegazione chiara e raccomanda l'invio di un array binario.
se stai scrivendo una stringa utilizzando l'oggetto WinHttpRequest, non è possibile esclusione come codifica la stringa per la trasmissione. L'oggetto WinHttpRequest convertirà sempre la stringa Unicode in UTF-8.
Tuttavia, si noti che una stringa Unicode che contiene solo 7 bit caratteri/ISO-8859-1-1 LATIN rimarrà invariata quando codificato come UTF-8 ;-) In tali casi, l'oggetto WinHttpRequest no aggiungi un attributo"Charset = UTF-8" all'intestazione Content-Type. (E io penserei che il server potrebbe supporre che i dati POST è ISO-8859-1.)
Quindi, se i dati di testo XML che stai scrivendo contiene Latin-1 alfanumerici o di punteggiatura codici di carattere (ogni meno di decimale 128), quindi tutto ciò che dovrebbe avere a che fare è specificare il "ISO-8859-1" charset nel Content-Type intestazione:
WinHttpReq.SetRequestHeader "Content-Type", "application/xml;Charset=ISO-8859-1"
Tuttavia, se i dati POST contiene 8 -bit caratteri, quindi non è possibile fornire i dati come una stringa al metodo di invio. Per evitare la conversione di UTF-8 , l'applicazione deve convertire la stringa in un array di byte e al suo posto viene fornito il . L'oggetto WinHttpRequest non tenterà alcuna conversione di dati su un array di byte.
saluti,
Stephen Sulzer
Microsoft Corporation
Una seconda opzione, altri che l'invio in una matrice binaria, è quello di passare a Msxml2.XMLHTTP
o Msxml2.ServerXMLHTTP
. Nessuno di questi elabora l'intestazione Content-Type
.Fortunatamente, quando è stato creato WinHttp.WinHttpRequest
, Microsoft ha utilizzato intenzionalmente Msxml2.XMLHTTP
come modello per l'interfaccia. Quindi, è abbastanza banale convertire il codice.
Inoltre, l'interfaccia COM. Quindi, mentre stai perdendo l'accesso ad alcune delle funzionalità esclusive di WinHttp.WinHttpRequest
, entrambi utilizzano lo stesso back-end.
La terza opzione è utilizzare ADODB.Stream
. Ti permette di lavorare con un IStream
, che non è qualcosa che puoi fare normalmente da VBA. Il seguente codice di esempio si basa sulla risposta alla domanda "How to create BinaryArray in VbScript?".
' Create a Binary Stream
Set objStreamBinary = CreateObject("ADODB.Stream")
objStreamBinary.Type = 1
objStreamBinary.Open
' Create a Text Stream
Set objStreamText = CreateObject("ADODB.Stream")
objStreamText.Type = 2
objStreamText.Open
' Copy the POST data to the Text Stream
objStreamText.WriteText strRequest
objStreamText.Position = 2
' Copy the Text Stream Contents to the Binary Stream
objStreamText.CopyTo objStreamBinary
objStreamText.Close
' Read the contents of the Binary Stream
' and send it to the WinHttpRequest object
web_Http.Send objStreamBinary.Read(-1)
Quali caratteri si aspettano? hai provato a specificarlo nella stringa 'Content-Type'? –
Il tipo di contenuto dovrebbe essere solo application/json senza altro, se il tipo di contenuto ha qualcosa oltre l'application/json ottengo un errore. Sì, ho provato a specificare la stringa Content-Type. Questo succede dopo aver impostato la richiesta. –
Prova a terminare la stringa con un punto e virgola. Qualche fortuna? –