Используя переменные с setRequestHeader, почему они не будут работать? - PullRequest
2 голосов
/ 12 июля 2019

Редактировать: проблема решена.По какой-то причине функция Base64Encode помещала разрыв строки в выходную строку, чего я не заметил, пока не откликнусь. Запишу вывод и посмотрю на исходный код страницы вместо скомпилированной страницы.


Я пытаюсь отправить JSON на удаленный сервер, чтобы получить ответ JSON (в основном я посылаю им данные, они выполняют расчеты на основе моих данных и отправляют обратно разные данные).Однако вместо получения данных сервер сообщает мне, что запрос не прошел аутентификацию.

Аутентификация включает в себя отправку строки, закодированной в base64, имени пользователя и пароля вместе.Эти значения могут меняться, поэтому я использую переменные для передачи информации.Это не работает, однако, если я ввожу полностью закодированное значение в виде строки, оно работает.

Function GetAPdataPost(sSendHTML, sURL)
  dim apHTTP
  dim sHTTPResponse
  dim API_KEY
  dim API_PWD
  dim auth

  API_KEY     = "fred"
  API_PWD     = "barney"
  auth = Base64Encode(API_KEY & ":" & API_PWD)
  Set apHTTP = Server.CreateObject("MSXML2.ServerXMLHTTP")
  apHTTP.Open "POST", sURL, false
  apHTTP.setRequestHeader "Content-Type", "application/json; charset=UTF-8" 
  apHTTP.setRequestHeader "Authorization","Basic ZnJlZDpiYXJuZXk=" '<-- works
  apHTTP.setRequestHeader "Authorization", "Basic " & auth '<-- doesn't work
  apHTTP.setRequestHeader "Content-Length", len(sSendHTML)
  apHTTP.setRequestHeader "Accept", "*/*"
  apHTTP.setRequestHeader "Account-Number", "00000004"
  apHTTP.setRequestHeader "Cache-Control", "no-cache"
  apHTTP.setRequestHeader "Connection", "close"

  On Error Resume Next
  apHTTP.send sSendHTML

  sHTTPResponse = apHTTP.responseText

  If Err.Number = 0 Then
    GetAPdataPost = sHTTPResponse
  Else
    GetAPdataPost = "Something went wrong: " & Err.Number
  End If
  On Error Goto 0

  Set apHTTP = Nothing
End Function

Использование первой строки приводит к правильному ответу с сервера, правильная строка JSON со всеми необходимымиданные.Вторая строка приводит к строке JSON с надписью «Ошибка проверки подлинности запроса».

Итак, помимо ввода строки в кодировке Base64, как получить переменную, которая будет распознана как допустимая строка?

Я должен только отметить, что я попытался окружить auth двойными кавычками ("") и Chr(34) безрезультатно.

Редактировать: Функция кодирования Base64.

Function Base64Encode(sText)
    Dim oXML, oNode

    Set oXML = CreateObject("Msxml2.DOMDocument.3.0")
    Set oNode = oXML.CreateElement("base64")
    oNode.dataType = "bin.base64"
    oNode.nodeTypedValue =Stream_StringToBinary(sText)
    Base64Encode = oNode.text
    Set oNode = Nothing
    Set oXML = Nothing
End Function

Function Stream_StringToBinary(Text)
  Const adTypeText = 2
  Const adTypeBinary = 1

  'Create Stream object
  Dim BinaryStream 'As New Stream
  Set BinaryStream = CreateObject("ADODB.Stream")

  'Specify stream type - we want To save text/string data.
  BinaryStream.Type = adTypeText

  'Specify charset For the source text (unicode) data.
  BinaryStream.CharSet = "us-ascii"

  'Open the stream And write text/string data To the object
  BinaryStream.Open
  BinaryStream.WriteText Text

  'Change stream type To binary
  BinaryStream.Position = 0
  BinaryStream.Type = adTypeBinary

  'Ignore first two bytes - sign of
  BinaryStream.Position = 0

  'Open the stream And get binary data from the object
  Stream_StringToBinary = BinaryStream.Read

  Set BinaryStream = Nothing
End Function

1 Ответ

2 голосов
/ 15 июля 2019

Функция Base64Encode помещала разрыв строки в выходную строку, чего я не заметил, пока не откликнусь. Запишу вывод и посмотрю на исходный код страницы вместо скомпилированной страницы.

Всегда не забывайте смотреть на необработанные данные, а не только на отображаемые данные (т.е. не такие, как я)

...