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