2017-04-13 40 views
0

作为一个快速背景:我已经成功地建立了一个小应用程序,它将连接到雅虎的API,并使用我的团队名单上的PUT请求每天设置我的阵容根据Yahoo Developer's GuideYahoo Fantasy体育API路由/发布错误

具体来说,在那里我有问题,现在:

POST

使用POST,玩家可以添加和/或从离队,或交易可以提出 。该URI张贴到交易集合是:

http://fantasysports.yahooapis.com/fantasy/v2/league//transactions

一个POST请求交易的API 与队中另一名球员更换一个玩家输入的XML格式是:

<fantasy_content> 
    <transaction> 
    <type>add/drop</type> 
    <players> 
     <player> 
     <player_key>{player_key}</player_key> 
     <transaction_data> 
      <type>add</type> 
      <destination_team_key>{team_key}</destination_team_key> 
     </transaction_data> 
     </player> 
     <player> 
     <player_key>{player_key}</player_key> 
     <transaction_data> 
      <type>drop</type> 
      <source_team_key>{team_key}</source_team_key> 
     </transaction_data> 
     </player> 
    </players> 
    </transaction> 
</fantasy_content> 

我的提出请求的方法如下:

def self.make_signed_request(address, method, user_id, input_file=nil) 

    # format http method and return false if not accepted API method 
    method = method.upcase 
    return false if (method != "GET") && (method != "POST") && (method != "PUT")  

    # find user 
    user = User.find(user_id) 

    if (user.yahoo_access_token_expiration.nil? || user.yahoo_access_token_expiration < Time.now) 
     # expired token, so renew 
     YahooOAuth.renew_token(user_id) 
     user.reload 
    end 

    # normalize text HMAC-SHA1 
    digest = OpenSSL::Digest.new('sha1') 
    nonce = rand(10 ** 30).to_s.rjust(30,'0') 
    timestamp = Time.now.to_i 
    text = method + "&" + CGI.escape("#{address}") + "&" + CGI.escape("oauth_consumer_key=#{YAHOO_OAUTH_API[:CLIENT_ID]}&oauth_nonce=#{nonce}&oauth_signature_method=HMAC-SHA1&oauth_timestamp=#{timestamp}&oauth_token=#{CGI.escape(user.yahoo_access_token)}&oauth_version=1.0") 

    # create key for HMAC-SHA1 
    key = CGI.escape("#{YAHOO_OAUTH_API[:CLIENT_SECRET]}")+ "&" + CGI.escape("#{user.yahoo_access_token_secret}") 

    # create HMAC-SHA1 signature for api request 
    hmac = OpenSSL::HMAC.digest(digest, key, text) 
    signature_sha1 = CGI.escape(Base64.strict_encode64(hmac))  

    # make API request 
    response = nil 
    if method == "GET" 
     response = Curl.get("#{address}?oauth_consumer_key=#{YAHOO_OAUTH_API[:CLIENT_ID]}&oauth_nonce=#{nonce}&oauth_signature_method=HMAC-SHA1&oauth_timestamp=#{timestamp}&oauth_token=#{CGI.escape(user.yahoo_access_token)}&oauth_version=1.0&oauth_signature=#{signature_sha1}") 
    elsif method == "POST" 
     # return "Not implemented" 
     response = Curl.post("#{address}?oauth_consumer_key=#{YAHOO_OAUTH_API[:CLIENT_ID]}&oauth_nonce=#{nonce}&oauth_signature_method=HMAC-SHA1&oauth_timestamp=#{timestamp}&oauth_token=#{CGI.escape(user.yahoo_access_token)}&oauth_version=1.0&oauth_signature=#{signature_sha1}", input_file) do |http| 
     http.headers['Accept'] = 'application/xml' 
     http.headers['Content-Type'] = 'application/xml' 
     end 
    elsif method == "PUT" 
     response = Curl.put("#{address}?oauth_consumer_key=#{YAHOO_OAUTH_API[:CLIENT_ID]}&oauth_nonce=#{nonce}&oauth_signature_method=HMAC-SHA1&oauth_timestamp=#{timestamp}&oauth_token=#{CGI.escape(user.yahoo_access_token)}&oauth_version=1.0&oauth_signature=#{signature_sha1}", input_file) do |http| 
     http.headers['Accept'] = 'application/xml' 
     http.headers['Content-Type'] = 'application/xml' 
     end 
    end 

    # return raw XML result 
    return response.body 

    end 

当我做了我的请求 -

def add_drop(players) 
    # players are added in [{player_key}, {add/drop}, {faab_bid (or nil if not FAAB)}] form 
    url = "http://fantasysports.yahooapis.com/fantasy/v2/league/#{self.league.league_key}/transactions" 
    builder = Nokogiri::XML::Builder.new(:encoding => 'UTF-8') do |xml| 
     xml.fantasy_content { 
     xml.transaction { 
      xml.type "add/drop" 
      xml.faab_bid players[0][2] unless players[0][2].nil? 
      xml.players { 
      players.each do |player| 
       xml.player { 
       xml.player_key player[0] 
       xml.transaction_data { 
        xml.type player[1] # this will be "add" or "drop" 
        # adds use "destination_team_key," drops use "source_team_key" 
        if player[1] == "add" 
        xml.destination_team_key self.team_key 
        else 
        xml.source_team_key self.team_key 
        end 
       } # transaction_data 
       } # player 
      end 
      } # players 
     } # transaction 
     } # fantasy_content 
    end # builder 
    xml_input = builder.to_xml 
    YahooOAuth.make_signed_request(url, 'put', self.user.id, xml_input) 
    end 

--the XML生成如下 -

"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<fantasy_content>\n <transaction>\n <type>add/drop</type>\n <players>\n  <player>\n  <player_key>357.p.10171</player_key>\n  <transaction_data>\n   <type>add</type>\n   <destination_team_key>370.l.4801.t.7</destination_team_key>\n  </transaction_data>\n  </player>\n  <player>\n  <player_key>357.p.9317</player_key>\n  <transaction_data>\n   <type>drop</type>\n   <source_team_key>370.l.4801.t.7</source_team_key>\n  </transaction_data>\n  </player>\n </players>\n </transaction>\n</fantasy_content>\n" 

- 和两个答复,我会从雅虎得到的是:

> <?xml version="1.0" encoding="UTF-8"?> <error xml:lang="en-us" 
> yahoo:uri="http://fantasysports.yahooapis.com/fantasy/v2/league/370.l.4801/transactions/?oauth_consumer_key=dj0yJmk9dHBIa0h4ekhTSVBnJmQ9WVdrOVlUZHFkMnhMTXpJbWNHbzlNQS0tJnM9Y29uc3VtZXJzZWNyZXQmeD1lNQ--&amp;amp;oauth_nonce=892057444475304460343340318332&amp;amp;oauth_signature_method=HMAC-SHA1&amp;amp;oauth_timestamp=1492097395&amp;amp;oauth_token=A%3D2.86iTDxtT4nQ.wxTcn33mgnA8dm3AeME87YRjNthVjxiwfhqKr_oWt0HBgbBeS2DC_dNObN72m0ucgi7CsSFaRjpc5IcnZ_bpJNTC3pUXc37bgH8f0S4irpyXLz8s9ONAYYB.LIDT0sOUvdTgk_lPDnlr1GlPhCe7u54Sq.m_vwq1JQlNUzEVrEs3kOW9wiXk17BditA9OGaVE.tuepvpthDRVBhOye8qjb_ic7UZtT.lvccoGEdgvcShHSyg.YYcnShl7ks23G01hAcXrfGveEk0UncWKNmma42cYbg7bzSOY9ZZj3_hvU5rK3SjB1ADPe8bsIEe_Ba9KBhYxlWd9iyyAR_bloL9n0eeL_OQ6PoR4uGJ6VMUDn9n_ovDGvfgAfvtJs15pCcXPhYusuo1S7SJF1O3fLtR8TitmU1qW88x3SenY2U50dlRG9Y73iNUdnyYBpIHLg._pPkms26QhnuxSFfqpXcGleGXOuZ0.TNOE3Cp8VbLEOEIg6QkavgGLKyFetYhSQ879T4rfhfeEoWvwkjsO1BL2Y3n4Hp9cgfU4y3wZvT.b8qhP7QY0UTYtZkyYH.sydFUXUCec.yVGm29S.s.2N96tfr4qWaI0qntRE.X5MVdwfbhz94n9JshmduqurjKRLlMYVWnLZ_Yderm0HDvT7dnowjyUwBx2UxUKJooauQnNU67QQECmh.HZqcm_OBysLABvdtTtaPhnvJ1QViN_UUjslToVPOs1oyxoTNRbL0VL8yxJc&amp;amp;oauth_version=1.0&amp;amp;oauth_signature=UVmcj2S8c5vqkRgAxsdQ3MQZI54%3D" 
> xmlns:yahoo="http://www.yahooapis.com/v1/base.rng" 
> xmlns="http://www.yahooapis.com/v1/base.rng"> 
> <description>subresource 'transactions' not supported.</description> 
> <detail/> </error> 

> <?xml version="1.0" encoding="UTF-8"?> <error xml:lang="en-us" 
> yahoo:uri="http://fantasysports.yahooapis.com/fantasy/v2/league/370.l.4801/transactions?oauth_consumer_key=dj0yJmk9dHBIa0h4ekhTSVBnJmQ9WVdrOVlUZHFkMnhMTXpJbWNHbzlNQS0tJnM9Y29uc3VtZXJzZWNyZXQmeD1lNQ--&amp;amp;oauth_nonce=503128074504907304111221170641&amp;amp;oauth_signature_method=HMAC-SHA1&amp;amp;oauth_timestamp=1492097198&amp;amp;oauth_token=A%3D2.86iTDxtT4nQ.wxTcn33mgnA8dm3AeME87YRjNthVjxiwfhqKr_oWt0HBgbBeS2DC_dNObN72m0ucgi7CsSFaRjpc5IcnZ_bpJNTC3pUXc37bgH8f0S4irpyXLz8s9ONAYYB.LIDT0sOUvdTgk_lPDnlr1GlPhCe7u54Sq.m_vwq1JQlNUzEVrEs3kOW9wiXk17BditA9OGaVE.tuepvpthDRVBhOye8qjb_ic7UZtT.lvccoGEdgvcShHSyg.YYcnShl7ks23G01hAcXrfGveEk0UncWKNmma42cYbg7bzSOY9ZZj3_hvU5rK3SjB1ADPe8bsIEe_Ba9KBhYxlWd9iyyAR_bloL9n0eeL_OQ6PoR4uGJ6VMUDn9n_ovDGvfgAfvtJs15pCcXPhYusuo1S7SJF1O3fLtR8TitmU1qW88x3SenY2U50dlRG9Y73iNUdnyYBpIHLg._pPkms26QhnuxSFfqpXcGleGXOuZ0.TNOE3Cp8VbLEOEIg6QkavgGLKyFetYhSQ879T4rfhfeEoWvwkjsO1BL2Y3n4Hp9cgfU4y3wZvT.b8qhP7QY0UTYtZkyYH.sydFUXUCec.yVGm29S.s.2N96tfr4qWaI0qntRE.X5MVdwfbhz94n9JshmduqurjKRLlMYVWnLZ_Yderm0HDvT7dnowjyUwBx2UxUKJooauQnNU67QQECmh.HZqcm_OBysLABvdtTtaPhnvJ1QViN_UUjslToVPOs1oyxoTNRbL0VL8yxJc&amp;amp;oauth_version=1.0&amp;amp;oauth_signature=oNaLute5djkIryUEKq0zF6prVFU%3D" 
> xmlns:yahoo="http://www.yahooapis.com/v1/base.rng" 
> xmlns="http://www.yahooapis.com/v1/base.rng"> 
> <description>Invalid XML POSTed. Error code 25 at line 3, column 0 of input XML.</description> 
> <detail/> </error> 

我真的不确定这两个响应之间有什么区别,因为我已经得到了两个响应,我确信这些响应都是相同的XML输入和POST参数。

有没有人有任何见解?

+0

是链接交易吗?检查雅虎,因为它似乎是你的错误。 –

+0

哪个链接?按照指南的说明,我将发布到http://fantasysports.yahooapis.com/fantasy/v2/league/370.l.4801/transactions。 这就是说,我认为我得到了“子资源”交易“不支持”错误从意外PUTing响应。 – EGibbs87

回答

0

刚刚遇到同样的问题,这个堆栈溢出文章是我在网上找到的唯一相关链接。决定这是我回馈给这个社区的时间...

问题是,在雅虎的交易页面上的示例XML之一是错误的。具有{}占位符且没有<faab_bid>节点的示例是正确的,但它下面的FAAB示例具有<destination_team_key>而不是<source_team_key>作为“drop”事务的一部分。当我确定为drop set节点使用“source_team_key”而不是“destination_team_key”时,事务开始工作。

我猜错误代码25是一个泛型错误,指示XML的某些部分是错误或意外的。如果这不能解决您的问题,请尝试从第一个添加/删除示例XML开始,逐个填写值。

希望这会有所帮助。

-Igor

+0

伊戈尔,谢谢!最后到达雅虎服务器。快乐的编码! – EGibbs87