POSTing xml to Google Checkout

c#, google-checkout, linq-to-xml

Solution

Your XML looks broken as Jon Skeet points out :-). In order to further aid debugging - there may be more information about the error in the response. `WebException` has a `Response` object that might have a more detailed error message that can be read by calling its `GetResponseStream()` method.

Problem

I'm experimenting with using Google Checkout and am having a problem posting to the checkout server. Here is my code: ``` 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(); ``` When I call GetResponse(), I get a `(400) Bad Request`. Any assistance on this would be gratefully received.

Original source