Передача ключа подписки в качестве заголовка запроса с msxml2.ServerXMLHTTP - Classi c ASP / VB - PullRequest
1 голос
/ 31 марта 2020

Я пытаюсь получить данные из API NHS, используя немного классических c ASP (все, что я знаю, я боюсь), но изо всех сил пытаюсь успешно передать ключ подписки в API.

Инструкции следующие:

  1. Выберите страницу на веб-сайте NHS, например: https://www.nhs.uk/conditions/acne.
  2. Запишите путь, например: условия / прыщи.
  3. Используя такой инструмент, как curl, Postman или ваш веб-браузер, сделайте запрос GET на https://api.nhs.uk/content/acne с действительным ключом подписки subscription- ключ: {ключ подписки} в заголовке запроса.
  4. Вы получите ответ JSON, структурированный с использованием schema.org, и поля для этого объяснены в следующей документации ....

С https://developer.api.nhs.uk/documentation/content-api

Итак, я написал следующее ...

<%
Set xml = Server.CreateObject("MSXML2.ServerXMLHTTP")
xml.Open "GET", "https://api.nhs.uk/conditions/abdominal-aortic-aneurysm-screening/", False
on error resume next
xml.setRequestHeader "subscription‑key", "MY-API-KEY-HERE"
xml.setRequestHeader "Content-Type", "application/json"
xml.setRequestHeader "Accept", "application/json"
xml.Send
Response.Write "<h1>The HTML text</h1><xmp>"
Response.Write xml.responseText
Set xml = Nothing
%>

Это просто дает мне следующий ответ: {" statusCode ": 401," message ":" Доступ запрещен из-за отсутствующего ключа подписки. Обязательно включайте ключ подписки, когда маки ng запросы к API. " }

У них есть примеры сценариев на 5 разных языках, но не ASP или даже ASP. NET

Есть идеи, что я могу попробовать, чтобы это работало?

Спасибо

РЕДАКТИРОВАТЬ

Попробуйте метод, предложенный здесь Как я могу публиковать данные с использованием cURL в asp classi c? . ..

<%
Dim http: Set http = Server.CreateObject("WinHttp.WinHttpRequest.5.1")
Dim url: url = "https://api.nhs.uk/conditions/abdominal-aortic-aneurysm-screening/"
'Dim data: data = "something=this" - took this out as its a querystring for POST

With http
  Call .Open("GET", url, False)
  'Call .SetRequestHeader("Content-Type", "application/x-www-form-urlencoded")
  Call .SetRequestHeader("subscription‑key", "MY-API-KEY-HERE")
  'Call .Send(data) <- the data was the querystring, so not relevant here
  Call .Send()
End With

If Left(http.Status, 1) = 2 Then
  'Request succeeded with a HTTP 2xx response, do something...
Else
  'Output error
  Call Response.Write("Server returned: " & http.Status & " " & http.StatusText)
End If
%>

Это дает мне неверный вызов процедуры или аргумент: 'SetRequestHeader'

РЕДАКТИРОВАТЬ С РЕШЕНИЕМ

Исправлен рабочий код с дефисом ...

<%
Dim http: Set http = Server.CreateObject("WinHttp.WinHttpRequest.5.1")
Dim url: url = "https://api.nhs.uk/conditions/abdominal-aortic-aneurysm-screening/"

With http
  Call .Open("GET", url, False)
  Call .SetRequestHeader("subscription-key", "MYKEYHERE")
  Call .Send()
End With

If Left(http.Status, 1) = 2 Then
  'Request succeeded with a HTTP 2xx response, do something...
  Response.Write http.responseText
Else
  'Output error
  Call Response.Write("Server returned: " & http.Status & " " & http.StatusText)
End If
%>

Спасибо Lankymart!

1 Ответ

2 голосов
/ 01 апреля 2020

Опробовал ваш пример дубликата, и он возвратил

Недопустимый вызов процедуры или аргумент: 'SetRequestHeader'

Это озадачило меня, так как этот код был проверен ранее и работать нормально, так что изменилось? Поэтому я копался в вызовах метода SetRequestHeader.

Оказывается, ошибка возникает только в этой строке;

Call .SetRequestHeader("subscription‑key", "MY-API-KEY-HERE")

В конце удаляется subscription‑ из имени заголовка и оно работал, не вызывая ошибки компиляции.

Это привело меня к проверке дефиса в коде, используя Asc("‑") и сравнивая его со стандартным дефисом и, конечно же, они разные.

<%
Response.Write Asc("‑") & "<br />" 'From the code
Response.Write Asc("-") & "<br />" 'Standard hyphen
%>

Вывод:

-15454
45

Заменил символ стандартным дефисом, ошибка исчезла, и код продолжает возвращаться;

Server returned: 401 Unauthorized
...