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。
我似乎遇到了几个 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。