Ebay API GetSuggestedCategories 调用未返回任何类别

Ebay API GetSuggestedCategories Call Returning No categories

我似乎遇到了几个 API 调用的问题,包括 GetSuggestedCategories 和 UploadSiteHostedPictures 调用。我将在此处重点介绍 GetSuggestedCategories 调用,因为两者都返回成功,但预期为空值。

如果有人可以查看我的代码并为我指出正确的方向以确定导致 returns 为空的原因,我将非常高兴。我花了几天时间尝试确定这一点,但没有成功。

对于 GetSuggestedCategories 调用,我的代码如下所示:

Public Function GetSuggestedCategories(keywords As String) As List(Of String)
    '<STAThread>
    Dim endpoint As String = "https://api.ebay.com/wsapi"
    Dim callName As String = "GetSuggestedCategories"
    Dim siteId As String = SiteCodeType.US
    Dim appId As String = "My App ID"
    Dim devId As String = "My Dev ID"
    Dim certId As String = "My Cert ID"
    Dim version As String = "1031"

    'build the request URL
    Dim requestURL As String = endpoint +
        "?callname=" + callName +
        "&siteid=" + siteId +
        "&appid=" + appId +
        "&version=" + version +
        "&routing=default"

    'Create the service
    Dim service As eBayAPIInterfaceClient = New eBayAPIInterfaceClient("eBayAPI", requestURL)
    Dim requesterCredentials As CustomSecurityHeaderType = New CustomSecurityHeaderType
    requesterCredentials.eBayAuthToken = "My User Token"
    requesterCredentials.Credentials = New UserIdPasswordType
    requesterCredentials.Credentials.AppId = appId
    requesterCredentials.Credentials.DevId = devId
    requesterCredentials.Credentials.AuthCert = certId

    'Make the call to GetSuggestedCategories
    Dim request As eBayWSDL.GetSuggestedCategoriesRequestType = New GetSuggestedCategoriesRequestType
    request.Version = version
    Dim ipHost As IPHostEntry = System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName())        
    For Each ipaddress As IPAddress In ipHost.AddressList
        Debug.Print(ipaddress.ToString)
        If ipaddress.AddressFamily = Sockets.AddressFamily.InterNetwork Then
            request.EndUserIP = ipHost.AddressList(2).ToString
            Exit For
        End If
    Next
    request.Query = keywords
    Dim detaillevels As New List(Of DetailLevelCodeType)
    detaillevels.Add(DetailLevelCodeType.ReturnAll)
    request.DetailLevel = detaillevels.ToArray

    Dim returnCategories As New List(Of String)
    Dim response As GetSuggestedCategoriesResponseType
    Try
        response = service.GetSuggestedCategories(requesterCredentials, request)
        If response.Ack <> AckCodeType.Failure Then
            returnCategories.Add("0: Complete with no errors.")
            returnCategories.Add(response.SuggestedCategoryArray.SuggestedCategory.FirstOrDefault.Category.CategoryID)
        Else
            returnCategories.Add("1: Errors returned.")
            Dim err As ErrorType
            For Each err In response.Errors
                returnCategories.Add(response.Errors(0).ErrorCode + ": " + response.Errors(0).ShortMessage)
            Next err

        End If
    Catch ex As Exception
    Finally
        service.Close()
        service = Nothing
        requesterCredentials = Nothing
        request = Nothing
        response = Nothing
    End Try
    Return returnCategories

当我 运行 此代码响应 returns ACK 代码 "Success" 但值都是空的。下图显示了具有空值的对象。

根据 eBay 的文档,我希望 response.SuggestedCategoryArray.SuggestedCategory 包含 1 个或多个类别,我可以在其中提取类别的名称、ID 等。

我已尝试 运行 查询,包括 "furniture"、"red chair"、"painting"、"art" 和 "o'keefe" 作为其中一些文档特别推荐作为示例,以便在提出广泛或特定请求时查看 returns 中的差异。一切 returns 与空 response.SuggestedCategoryArray.

经过又一天的研究、试验和无数错误后,我似乎找到了处理这个问题的方法。

关键是响应对象有很多属性,但其中 none 会以任何方式填充。可能是因为这些在对象的某些早期实现中使用过但不再使用。可以看到除了"Any"属性什么都没有填,也就是key.

"Any" 属性 收到一个 XmlElement 对象,其中包含 Xml 格式的完整响应。我所做的只是将 Xml 解析为 XDocument,然后使用 LINQ 查找和读取我要查找的元素。对于 Getsuggestedcategories,我找到了 CategoryID 元素并将值输出到列表中。

这是我的代码更改的片段,从响应对象的实例化开始。

Dim response As GetSuggestedCategoriesResponseType = asyncResponse.GetSuggestedCategoriesResponse1
        If response.Ack <> AckCodeType.Failure Then
            If Not response.SuggestedCategoryArray Is Nothing Then
                For Each cID In response.SuggestedCategoryArray.SuggestedCategory
                    returnCategories.Add(cID.Category.CategoryID)
                Next
            ElseIf Not response.Any Is Nothing Then
                returnCategories.Add("0: Complete with no errors.")
                For Each xmlResponse In response.Any
                    Dim xmlConverter As New XmlDocumentConverter(xmlResponse)
                    returnCategories.AddRange(xmlConverter.ConvertToStringList("CategoryID"))
                Next
            Else
                returnCategories.Add("2: No Suggested Categories Were Found.")
            End If
        Else
            returnCategories.Add("1: Errors returned.")
            Dim err As ErrorType
            For Each err In response.Errors
                returnCategories.Add(response.Errors(0).ErrorCode + ": " + response.Errors(0).ShortMessage)
            Next err

        End If
    Catch ex As Exception
    Finally
        service.Close()
        service = Nothing
        requesterCredentials = Nothing
        request = Nothing
        asyncResponse = Nothing
    End Try
    Return returnCategories

这是我为 Xml 转换器创建的代码,它读取 xmlElement 和 return 字符串值列表。

Imports System.Globalization
Imports System.IO
Imports System.Xml

Namespace Converters.XML
Public Class XmlDocumentConverter

    Private xmlDoc As XDocument

    Public Sub New(xmlDocumentToRead As XmlDocument)
        xmlDoc = XDocument.Parse(xmlDocumentToRead.OuterXml)
    End Sub

    Public Sub New(xmlElementToRead As XmlElement)
        xmlDoc = XDocument.Parse(xmlElementToRead.OuterXml)
    End Sub

    ''' <summary>
    ''' This will take the nodeToFind representing the xDocument.Name.LocalName and will return the contained value within all found elements.
    ''' </summary>
    ''' <param name="nodeToFind">The string matching the xDocument.Name.LocalName that you would like to find.</param>
    ''' <param name="returnAllResults">If True, returns all results. If False, returns the first result</param>
    ''' <returns></returns>
    Public Function ConvertToStringList(nodeToFind As String, Optional returnAllResults As Boolean = True) As List(Of String)
        Dim returnStringList = New List(Of String)

        Dim xElementList As New List(Of XElement)
        xElementList.AddRange(xmlDoc.Root.Descendants.Where(Function(x) x.Name.LocalName = nodeToFind))
        For Each e In xElementList
            returnStringList.Add(e.Value)
            If returnAllResults = False Then Exit For
        Next

        Return returnStringList
    End Function

End Class

结束命名空间

仍然欢迎反馈和建议,因为这是我能想到的最佳答案,但欢迎任何有更好想法或 eBay 实施的人 API。