2016-02-26 26 views
5

Sto cercando di fare una richiesta al API kigo utilizzando VBA WinHttp.WinHttpRequest, sono stato in grado di inviare una richiesta, ma WinHttpRequest cambia il tipo di contenuto aggiungendo charset = UTF -8 quando invia la richiesta, con che kigo's api restituisce 415 errori.WinHttp.WinHttpRequest aggiungendo al tipo di contenuto

ho impostato il tipo di contenuto come questo

web_Http.SetRequestHeader "Content-Type", "application/json" 

ma quando la guardo la richiesta Wireshark il tipo di contenuto è come questo

Content-Type: application/json; Charset=UTF-8 

Tutte le idee?

Ho trovato this, che è simile al mio problema ma non capisco la soluzione.

+0

Quali caratteri si aspettano? hai provato a specificarlo nella stringa 'Content-Type'? –

+0

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. –

+0

Prova a terminare la stringa con un punto e virgola. Qualche fortuna? –

risposta

0

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) 
+0

'Poiché VBA non ha array fortemente tipizzati' - VBA ha matrici fortemente tipizzate. VBScript è una lingua diversa. – GSerg

+0

@GSerg ringrazia. Non ne ero consapevole Ho rimosso quella frase dalla mia risposta. – jveazey

Problemi correlati