2016-02-26 86 views
5

próbuję złożyć wniosek API Kigo w użyciu VBA WinHttp.WinHttpRequest, udało mi się wysłać żądanie, ale WinHttpRequest zmienia typ zawartości dodając charset = UTF -8 kiedy wysyła żądanie, z tym, że api Kigo zwraca błąd 415.WinHttp.WinHttpRequest dodanie do zawartości typu

ustawić typ zawartości jak ten

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

ale kiedy patrzę na życzenie w Wireshark zawartość typu jest jak ten

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

jakieś pomysły?

Znalazłem this, który jest podobny do mojego problemu, ale nie rozumiem rozwiązania.

+0

Jakiego zestawu znaków oczekują? czy próbowałeś podać go w swoim łańcuchu 'Content-Type'? –

+0

Typ treści powinien być tylko aplikacją/json bez niczego innego, jeśli typ zawartości ma cokolwiek poza aplikacją/json, pojawia się błąd. Tak, próbowałem określić ciąg Content-Type. Zdarza się to po skonfigurowaniu żądania. –

+0

Spróbuj zakończyć ciąg za pomocą średnika. Trochę szczęścia? –

Odpowiedz

0

Występuję również w tym problemie. Wydaje się być ograniczony do interfejsu COM WinHttp.WinHttpRequest. Istnieje kilka różnych opcji, aby rozwiązać ten problem.

Po kilku kopaniu znalazłem this post od pracownika firmy Microsoft. Daje jasne wyjaśnienie i zaleca wysłanie tablicy binarnej.

Jeśli Piszesz ciąg pomocą WinHttpRequest obiektu, nie można przesłanianie jak koduje ciąg transmisji. Obiekt WinHttpRequest zawsze konwertuje ciąg znaków Unicode na kodowanie UTF-8.

Należy jednak pamiętać, że ciąg Unicode, który zawiera tylko 7-bitowy Latin-1 znaków/ISO-8859-1 pozostaną niezmienione, gdy zakodowany jako UTF-8 ;-) W takich przypadkach WinHttpRequest obiekt nie dodaj atrybut "Charset = UTF-8" do nagłówka Content-Type. (A ja myślę że serwer będzie zakładać, że dane POST jest ISO-8859-1).

Więc, jeśli dane XML tekst Piszesz zawiera Latin-1 alfanumerycznych interpunkcyjnych lub kody znaków (każdy mniej niż dziesiętny 128), a następnie wszystkim należy musisz zrobić, to określić "ISO-8859-1" charset w Content-Type nagłówka:

WinHttpReq.SetRequestHeader "Content-Type", "application/xml;Charset=ISO-8859-1"

Jednakże, jeśli dane POST zawiera 8 -bitowe znaki, wtedy nie można dostarczyć danych jako ciągu do metody Wyślij. W celu uniknięcia konwersji UTF-8 , Twoja aplikacja musi przekonwertować ciąg na tablicę bajtów, a zamiast tego podać ją jako . Obiekt WinHttpRequest nie będzie próbował żadnej konwersji danych w tablicy bajtów.

Pozdrawiam,

Stephen Sulzer

Microsoft Corporation


Druga opcja, inne niż wysyłanie w binarnej macierzy, jest przejście na Msxml2.XMLHTTP lub Msxml2.ServerXMLHTTP. Żadne z tych nie łączy nagłówka Content-Type.Na szczęście, gdy stworzono WinHttp.WinHttpRequest, Microsoft celowo użył Msxml2.XMLHTTP jako szablonu dla interfejsu. Przekształcenie kodu jest dość trywialne.

Również interfejs COM Msxml2.ServerXMLHTTPuses WinHTTP internally. Tak więc, podczas gdy tracisz dostęp do niektórych funkcji, które są wyłączne dla WinHttp.WinHttpRequest, oba używają tego samego zaplecza.


Trzecią opcją jest użycie ADODB.Stream. To pozwala pracować z IStream, co nie jest czymś, co normalnie można zrobić z VBA. Poniższy przykładowy kod jest oparty na odpowiedzi na pytanie "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

'Ponieważ VBA nie ma silnie wpisanych tablic' - VBA ma silnie wpisane tablice. VBScript to inny język. – GSerg

+0

@GSerg dzięki. Nie wiedziałem. Usunąłem to zdanie z mojej odpowiedzi. – jveazey