Vb.net 易趣API GetSuggestedCategories调用不返回任何类别

Vb.net 易趣API GetSuggestedCategories调用不返回任何类别,vb.net,ebay-api,Vb.net,Ebay Api,我似乎对一些API调用有问题,包括GetSuggestedCategories和UploadSiteHostedPictures调用。我将在这里重点介绍GetSuggestedCategories调用,因为两者都返回成功,但在预期的情况下返回空值 如果有人能检查我的代码,并为我指出正确的方向,以确定是什么导致返回为空,我会很高兴。我花了好几天的时间试图确定这一点,但运气不佳 对于GetSuggestedCategories调用,我的代码如下所示: Public Function GetSugge

我似乎对一些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
公共函数GetSuggestedCategories(关键字作为字符串)作为列表(字符串)
'
将端点设置为字符串=”https://api.ebay.com/wsapi"
Dim callName As String=“GetSuggestedCategories”
Dim siteId为String=SiteCodeType.US
Dim appId As String=“我的应用程序ID”
Dim devId As String=“我的开发ID”
Dim certId As String=“我的证书ID”
Dim版本为String=“1031”
'生成请求URL
Dim requestURL作为字符串=端点+
“?callname=“+callname+
“&siteid=“+siteid+
“&appid=“+appid+
“&version=“+version”+
“&路由=默认值”
'创建服务
作为eBayAPIInterfaceClient的Dim服务=新的eBayAPIInterfaceClient(“eBayAPI”,requestURL)
Dim requesterCredentials作为CustomSecurityHeaderType=新CustomSecurityHeaderType
requesterCredentials.eBayAuthToken=“我的用户令牌”
requesterCredentials.Credentials=新用户IDPasswordType
requesterCredentials.Credentials.AppId=AppId
requesterCredentials.Credentials.DevId=DevId
requesterCredentials.Credentials.AuthCert=certId
'调用GetSuggestedCategories
Dim请求作为eBayWSDL.GetSuggestedCategoriesRequestType=新GetSuggestedCategoriesRequestType
request.Version=Version
将ipHost设置为IPHostEntry=System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName())
将每个IP地址作为ipHost.AddressList中的IP地址
Debug.Print(ipaddress.ToString)
如果ipaddress.AddressFamily=Sockets.AddressFamily.InterNetwork,则
request.EndUserIP=ipHost.AddressList(2).ToString
退出
如果结束
下一个
request.Query=关键字
将DetailLevel设置为新列表(DetailLevelCodeType的)
添加(DetailLevelCodeType.ReturnAll)
request.DetailLevel=detaillevels.ToArray
Dim returnCategories作为新列表(字符串)
作为GetSuggestedCategoriesResponseType的Dim响应
尝试
response=service.GetSuggestedCategories(requesterCredentials,请求)
如果响应.Ack AckCodeType.Failure,则
returnCategories.Add(“0:完成,无错误”)
returnCategories.Add(response.suggestedCategorialray.SuggestedCategory.FirstOrDefault.Category.Categorid)
其他的
returnCategories.Add(“1:返回的错误”)
作为错误类型的Dim err
对于响应中的每个错误。错误
returnCategories.Add(response.Errors(0).ErrorCode+”:“+response.Errors(0).ShortMessage)
下一个错误
如果结束
特例
最后
服务关闭()
服务=无
requesterCredentials=无
请求=无
响应=无
结束尝试
退货类别
当我运行此代码时,响应返回一个ACK代码“Success”,但值都为空。下面的图像显示了具有空值的对象

根据易趣提供的文档,我希望
回复.SuggestedCategoryArray.SuggestedCategory
包含一个或多个类别,我可以从中提取类别的名称、id等


我曾尝试运行包括“家具”、“红椅子”、“绘画”、“艺术”和“o'keefe”在内的查询,因为文档中特别推荐了其中一些查询作为示例,以便在提出广泛或特定请求时查看退货差异。一切都以一个空的
响应返回。SuggestedCategoryArray

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

关键是响应对象有许多属性,但没有一个以任何方式填充。这可能是因为在对象的一些早期实现中使用了它们,但现在不再使用。您可以看到,除了“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
Dim响应为GetSuggestedCategoriesResponseType=asyncResponse.GetSuggestedCategoriesResponse1
如果响应.Ack AckCodeType.Failure,则
如果不是response.SuggestedCategoryArray,则什么都不是
对于response.SuggestedCategoryArray.SuggestedCategory中的每个cID
returnCategories.Add(cID.Category.CategoryID)
下一个
如果没有回应,那么什么都不是
returnCategories.Add(“0:完成,无错误”)
对于响应中的每个xmlResponse.Any
Dim xmlConverter作为新的XmlDocumentConverter(xmlResponse)
returnCategories.AddRange(xmlConverter.ConvertToStringList(“CategoryID”))
下一个
其他的
returnCategories.Add(“2:未找到建议的类别”)
如果结束
其他的
returnCategories.Add(“1:返回的错误”)
作为错误类型的Dim err
对于响应中的每个错误。错误
返回类别。添加(r)
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