代码之家  ›  专栏  ›  技术社区  ›  DavidGouge

将XML发布到Google Checkout

  •  3
  • DavidGouge  · 技术社区  · 16 年前

    我正在尝试使用google checkout,但在发送到checkout服务器时遇到了问题。这是我的代码:

    XNamespace ns = XNamespace.Get("http://checkout.google.com/schema/2");
    
    XDocument cart = new XDocument();
    XElement rootElement = new XElement(ns + "checkout-shopping-cart",
        new XElement("shopping-cart",
            new XElement("items",
                new XElement("item",
                    new XElement("item-name", "doodad"),
                    new XElement("item-description", "Description for the doodad"),
                    new XElement("unit-price", 9.99, new XAttribute("currency", "GBP")),
                    new XElement("quantity", 1)
                )
             )
        )
    );
    
    cart.Add(rootElement);
    
    string authKey = "111222333444:NOTAREALKEY";
    authKey = EncodeToBase64(authKey);
    
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://checkout.google.com/cws/v2/Merchant/111222333444/merchantCheckout");
    
    request.Method = "POST";
    byte[] byteArray = Encoding.UTF8.GetBytes(cart.ToString());
    request.ContentType = "application/xml; charset=UTF-8";
    request.ContentLength = byteArray.Length;
    request.Headers.Add("Authorization: Basic " + authKey);
    request.Accept = "application/xml; charset=UTF-8";
    
    Stream dataStream = request.GetRequestStream();
    dataStream.Write(byteArray, 0, byteArray.Length);
    dataStream.Close();
    
    HttpWebResponse response = (HttpWebResponse)request.GetResponse(); // Exception here!
    dataStream = response.GetResponseStream();
    StreamReader reader = new StreamReader(dataStream);
    string responseText = reader.ReadToEnd();
    
    reader.Close();
    dataStream.Close();
    response.Close();
    

    当我调用getResponse()时,我得到一个 (400) Bad Request .

    对此,我们将不胜感激。

    3 回复  |  直到 16 年前
        1
  •  4
  •   Duncan Smart    16 年前

    正如jon skeet指出的那样,您的XML看起来已经损坏了:-)。为了进一步帮助调试,响应中可能有更多关于错误的信息。 WebException 有一个 Response 对象,该对象可能具有更详细的错误消息,可以通过调用其 GetResponseStream() 方法。

        2
  •  2
  •   Jon Skeet    16 年前

    不知道任何关于google checkout api的信息,您确定不需要在 每个 那些元素?

    XElement rootElement = new XElement(ns + "checkout-shopping-cart",
        new XElement(ns + "shopping-cart"),
            new XElement(ns + "items",
                         // etc
    

    那当然是什么 Checkout API guide 向我建议-请注意,“xmlns=…”表示这是此元素和所有子元素的命名空间,除非另有指定。

        3
  •  0
  •   Tomas Kirda    16 年前

    如果异常为WebException,您仍然可以读取响应消息。这将为您提供有关问题的更多信息:

    try {
       response = (HttpWebResponse)request.GetResponse();
    }
    catch (WebException ex1) {
       response = ex1.Response();
    }
    
    推荐文章