【问题标题】:Ebay API GetSuggestedCategories Call Returning No categoriesEbay API GetSuggestedCategories 调用返回无类别
【发布时间】:2017-09-02 18:57:24
【问题描述】:

我似乎遇到了一些 API 调用问题,包括 GetSuggestedCategories 和 UploadSiteHostedPictures 调用。我将在这里重点关注 GetSuggestedCategories 调用,因为两者都返回成功,但预期值为空。

如果有人可以查看我的代码并指出正确的方向来确定导致返回为空的原因,我会很高兴。我花了几天时间试图确定这一点,但没有运气。

对于 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

当我运行此代码时,响应返回一个“成功”的 ACK 代码,但这些值都是空的。下图显示了具有空值的对象。

根据来自 eBay 的文档,我预计 response.SuggestedCategoryArray.SuggestedCategory 将填充 1 个或多个类别,我可以在其中提取类别的名称、ID 等。

我尝试运行包括“家具”、“红色椅子”、“绘画”、“艺术”和“o'keefe”在内的查询,因为文档特别推荐其中一些作为示例来查看回报的差异当提出广泛或具体的要求时。一切都返回一个空的response.SuggestedCategoryArray

【问题讨论】:

    标签: vb.net ebay-api


    【解决方案1】:

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

    关键是响应对象有很多属性,但它们都没有以任何方式填充。这可能是因为这些在对象的一些早期实现中使用但不再使用。您可以看到除了“Any”属性(这是关键)之外没有填充任何内容。

    “Any”属性接收一个 XmlElement 对象,该对象包含 XmlFormat 中的完整响应。我所做的只是将 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
    

    这是我为 XmlConverter 创建的代码,它读取 xmlElement 并返回一个字符串值列表。

    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 实现的人。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多