Я тоже сталкиваюсь с этой проблемой. Он, по-видимому, ограничен интерфейсом COM WinHttp.WinHttpRequest
. Существует несколько различных вариантов решения этой проблемы.
После некоторого рытья я нашел this post от сотрудника Microsoft. Он дает четкое объяснение и рекомендует отправлять в двоичный массив.
Если вы публикуете строку, используя WinHttpRequest объекта, вы не можете переопределения, как он кодирует строку для передачи. Объект WinHttpRequest всегда будет преобразовывать строку Unicode в UTF-8.
Однако следует отметить, что строка Unicode, который содержит только 7-битный Latin-1/ISO-8859-1 символы будут оставаться неизменными, когда кодируется как UTF-8 ;-) В таких случаях WinHttpRequest объект не добавьте атрибут «Charset = UTF-8» в заголовок Content-Type. (И я думаю , что сервер будет считать, что данные POST является ISO-8859-1.)
Таким образом, если текстовые данные XML, которые вы публикуете содержит Latin-1 буквенно-цифровые или пунктуации коды символов (каждый менее десятичных 128), то все, что вы должны сделать, это указать «ISO-8859-1» кодировка в вашем Content-Type заголовка:
WinHttpReq.SetRequestHeader "Content-Type", "application/xml;Charset=ISO-8859-1"
Однако, если данные POST содержат 8 -битных символов, то вы не можете предоставить данные в виде строки для метода отправки. Чтобы избежать преобразования UTF-8 , ваше приложение должно преобразовать строку в массив байтов, а вместо этого - . Объект WinHttpRequest не будет пытаться преобразовывать данные в массив байтов .
С уважением,
Стивен Sulzer
Microsoft Corporation
Второй вариант, кроме отправки в двоичный массив, чтобы переключиться на Msxml2.XMLHTTP
или Msxml2.ServerXMLHTTP
. Ни один из них не качает заголовок Content-Type
.К счастью, когда был создан WinHttp.WinHttpRequest
, Microsoft намеренно использовала Msxml2.XMLHTTP
в качестве шаблона для интерфейса. Таким образом, довольно просто преобразовать код.
Также, интерфейс Msxml2.ServerXMLHTTP
COM uses WinHTTP internally. Таким образом, пока вы теряете доступ к некоторым функциям, которые являются исключительными для WinHttp.WinHttpRequest
, оба используют один и тот же бэкэнд.
Третий вариант заключается в использовании ADODB.Stream
. Это позволяет вам работать с IStream
, что вы обычно не можете делать с VBA. Пример кода ниже основан на ответе на вопрос "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)
Какую кодировку они ожидают? вы пробовали указать его в строке 'Content-Type'? –
Тип содержимого должен быть только application/json без чего-либо еще, если тип содержимого имеет что-либо помимо приложения/json, я получаю сообщение об ошибке. Да, я попытался указать строку Content-Type. Это происходит после установки запроса. –
Попробуйте положить строку в точку с запятой. При удаче? –