Вопрос или проблема
Я использую следующий VBA для вызова API FedEx, чтобы получить статус доставки. Я могу использовать аналогичный код для получения токена. Это работает.
Когда я пытаюсь получить данные по номеру отслеживания, я получаю TransactionID и ничего в выводе.
Пример ResponseText: “{“transactionId”:”xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx”,”output”:{}}”
Аналогичные результаты происходят в Dev и Prod. Я что-то упустил в теле запроса?
Sub TrackFedExPackage()
Dim xmlhttp As Object
Dim url As String
Dim accessToken As String
Dim trackingNumber As String
Dim requestBody As String
Dim responseText As String
accessToken = GetFedExOAuthToken()
trackingNumber = "1234567890123"
url = "https://apis-sandbox.fedex.com/track/v1/trackingnumbers"
'url = "https://apis.fedex.com/track/v1/trackingnumbers?"
' Создать тело JSON запроса
requestBody = "{""trackingInfo"": [{""trackingNumber"": """ & trackingNumber & """}]}"
' Создать объект XMLHTTP
Set xmlhttp = CreateObject("MSXML2.XMLHTTP")
' Открыть соединение
With xmlhttp
.Open "POST", url, False
.setRequestHeader "Authorization", "Bearer " & accessToken
.setRequestHeader "Content-Type", "application/json"
.send requestBody
End With
' Получить ответ
responseText = xmlhttp.responseText
' Отобразить ответ
MsgBox responseText
' Очистить
Set xmlhttp = Nothing
End Sub
Я пытался найти другие примеры на VBA, C#, JavaScript и другие, и коды выглядят похоже.
Вот функция токена
Function GetFedExOAuthToken() As String
Dim http As Object
Dim url As String
Dim requestBody As String
Dim clientId As String
Dim clientSecret As String
Dim responseText As String
' Ваши учетные данные API FedEx
clientId = "ClientidDev" 'Dev
clientSecret = "clientSecretDev" 'Dev
' Создать объект HTTP
Set http = CreateObject("MSXML2.XMLHTTP")
' Установить URL для запроса токена OAuth
url = "https://apis-sandbox.fedex.com/oauth/token" 'Dev
'url = "https://apis.fedex.com/oauth/token" 'Prod
' Сформировать тело запроса
requestBody = "grant_type=client_credentials&client_id=" & clientId & "&client_secret=" & clientSecret
' Отправить запрос
With http
.Open "POST", url, False
.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
.send requestBody
responseText = .responseText
End With
' Извлечь токен доступа из ответа
Dim json As Object
Set json = JsonConverter.ParseJson(responseText)
GetFedExOAuthToken = json("access_token")
' Очистить
Set http = Nothing
Set json = Nothing
Конец функции
Ответ или решение
Когда вы сталкиваетесь с проблемой получения из API FedEx только идентификатора транзакции и отсутствием данных об отслеживании, может быть несколько причин, по которым это происходит. Давайте разберем ваш код и возможные причины.
1. Проверка Запроса
Ваш запрос к API выглядит практически правильным, однако важно убедиться, что тело запроса формируется корректно, и что все необходимые параметры включены. Рассмотрим вашу строку создания тела запроса:
requestBody = "{""trackingInfo"": [{""trackingNumber"": """ & trackingNumber & """}]}"
Убедитесь, что вы используете правильную структуру JSON, которую ожидает API. В документации к FedEx API должно быть указано, как именно должен выглядеть запрос. Возможно, вместо поля trackingInfo
, вам нужно использовать другое название или добавить дополнительные параметры.
2. Проверка Учетных Данных
Проверьте, правильны ли ваши учетные данные (значения clientId
и clientSecret
). Если токен OAuth не имеет необходимого доступа, API может вернуть пустой ответ. Убедитесь, что вы используете токен, полученный именно для доступа к API отслеживания.
accessToken = GetFedExOAuthToken()
3. Управление Ошибками
Ваш код не обрабатывает ошибки, возвращаемые API. Добавьте дополнительную проверку состояния запроса и журналирование для лучшего понимания проблемы. Например, добавьте следующее сразу после отправки запроса:
If xmlhttp.Status <> 200 Then
MsgBox "Error: " & xmlhttp.Status & " - " & xmlhttp.StatusText
Exit Sub
End If
4. Проверка Тестового Номера Отслеживания
Убедитесь, что ваш номер отслеживания действителен и соответствует формату, ожидаемому API FedEx. Иногда номера могут быть недоступны для проверки в тестовой среде (sandbox).
5. Обращение к Документации
Вернитесь к официальной документации FedEx API для получения актуальной информации о формате запроса. Посмотрите секцию, посвященную отслеживанию отправлений, чтобы убедиться в соответствии вашему запросу.
6. Примеры Запросов
Вот пример правильного запроса (проверьте его с актуальной документацией):
{
"trackingInfo": [{
"trackingNumber": "1234567890123"
}]
}
7. Использование Postman или cURL
Для дальнейшей диагностики проблемы вы можете использовать такие инструменты, как Postman или cURL, для ручного запроса к API. Это поможет выявить, является ли проблема в коде VBA или нет.
Заключение
Если после выполнения всех вышеуказанных шагов проблема сохраняется, возможно, имеет смысл обратиться в службу поддержки FedEx API. Они могут предоставить дополнительную информацию о том, почему ваш запрос возвращает лишь идентификатор транзакции и не возвращает ожидаемых данных.