2016-02-26 9 views
5

Я пытаюсь сделать запрос к API Kigo, используя Vba WinHttp.WinHttpRequest, я был в состоянии послать запрос, но WinHttpRequest изменяет тип содержимого при добавлении Charset = UTF -8, когда он отправляет запрос, при этом api kigo api возвращает ошибку 415.WinHttp.WinHttpRequest добавление к содержимому типа

Я установил тип содержимого, как этот

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

, но когда я смотрю на просьбу в Wireshark тип содержимого, как это

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

Любые идеи?

Я нашел this, что похоже на мою проблему, но я не понимаю решение.

+0

Какую кодировку они ожидают? вы пробовали указать его в строке 'Content-Type'? –

+0

Тип содержимого должен быть только application/json без чего-либо еще, если тип содержимого имеет что-либо помимо приложения/json, я получаю сообщение об ошибке. Да, я попытался указать строку Content-Type. Это происходит после установки запроса. –

+0

Попробуйте положить строку в точку с запятой. При удаче? –

ответ

0

Я тоже сталкиваюсь с этой проблемой. Он, по-видимому, ограничен интерфейсом 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) 
+0

'Поскольку VBA не имеет строго типизированных массивов' - VBA имеет строго типизированные массивы. VBScript - это другой язык. – GSerg

+0

@GSerg спасибо. Я не знал. Я удалил это предложение из своего ответа. – jveazey

 Смежные вопросы

  • Нет связанных вопросов^_^