РАЗМЕЩАТЬ XML в Google Checkout - PullRequest
3 голосов
/ 27 января 2010

Я экспериментирую с использованием Google 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 ]

4 голосов
/ 27 января 2010

Ваш XML выглядит испорченным, как указывает Джон Скит :-). Для дальнейшей помощи в отладке - может быть больше информации об ошибке в ответе. WebException имеет объект Response, который может содержать более подробное сообщение об ошибке, которое можно прочитать, вызвав его метод GetResponseStream().

2 голосов
/ 27 января 2010

Ничего не зная об API Google Checkout, вы уверены, что вам не нужно пространство имен для каждого этих элементов?

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

Это, безусловно, то, что руководство API Checkout предлагает мне - обратите внимание, что "xmlns = ..." означает, что это пространство имен для этого элемента и всех элементов-потомков, если не указано иное.

0 голосов
/ 24 марта 2010

Вы все еще можете прочитать ответное сообщение, если исключением является WebException. Это даст вам больше информации о том, что не так:

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