XMLRPC.Net, как вы передаете в связанный массив? - PullRequest
0 голосов
/ 08 марта 2011

Я использую библиотеку с открытым исходным кодом xmlrpc.net и пытаюсь вызвать службу, у которой есть входной параметр, который является ассоциативным массивом.

Документация по вызову (я пытаюсь интегрироваться с phpsite под названием Magento и по ошибкам, которые он выдает, я знаю, что он использует библиотеку Zend xmlrpc.)

Имя метода: sales_order_shipment.create Создать новую партию для заказа

Возврат: строка - идентификатор приращения отгрузки

Аргументы:

string orderIncrementId - идентификатор приращения заказа массив itemsQty - количество элементов для отправки в виде ассоциативного массива (order_item_id ⇒ количество) комментарий к строке - комментарий по отправке (необязательно) логическая почта - флаг отправки электронной почты (необязательно) логический includeComment - включить комментарий в флаг электронной почты (необязательно)

Так что в .Net мне удалось заставить работать следующее

proxy.Create(sessionId, "sales_order_shipment.create", new object[] { 100000010, new object[] { }, "Shipment Created", true, true });

но я не могу понять, какой тип .Net я должен передать для itemsQty. новый объект [] {} работает, но мне нужно иметь возможность передать отправленные товары, а не просто создать груз с 0 отправками. Какой тип .Net можно использовать для сопоставления с Ассоциированным массивом с помощью xmlrpc.net

Ответы [ 2 ]

2 голосов
/ 11 марта 2011

Не видя запрос XML-RPC, который должен быть сгенерирован, спецификация мне не ясна, но как насчет использования XmlRpcStruct, например:

XmlRpcStruct items = new XmlRpcStruct();
items["orderid1"] = 1;
items["orderid2"] = 2;

(при условии, что идентификатор заказа является строкой)

1 голос
/ 28 сентября 2012

Я играл с соответствующим методом sales_order_invoice.create и столкнулся с той же проблемой, что и вы.Я только что обнаружил, что по какой-то причине мне пришлось вставить дополнительный элемент в массив аргументов, передаваемых на сервер, если я включил комментарий в счет-фактуру.

Я использую Magento EE ver.1.11.0.2 использование C # и библиотеки XML-RPC.Net v2 (CookComputing.XmlRpcV2.dll) для интеграции данных с Magento.

Я наткнулся на это решение, заметив, что комментарий к пустым счетам был «0», которое было значением, которое я указывал для поля Send invoice on email (optional), и решил попробовать вставить пустой элемент перед комментарием, и комментарий появился, но по-прежнему не было выставлено счетов.Затем я переместил пустой элемент перед списком элементов, и все заработало.Я проверил код для API /app/code/core/Mage/Sales/Model/Order/Invoice/Api.php, но не смог найти, где и почему это будет иметь место.Я могу только предположить, что это как-то связано с библиотекой, которая разбирает запрос XML-RPC, что-то не так, поскольку этот вызов имеет массив в середине других аргументов.

При попыткедиагностируйте это, я использовал регистратор XML-RPC

logger = new RequestResponseLogger();
logger.Directory = "C:\Temp\";
magentoProxy.AttachLogger(logger);
logger.UnsubscribeFrom(magentoProxy);

Затем в любое время, когда я хочу посмотреть, каковы ответы на запрос на вызов, я просто помещаю эти вызовы до и после вызова XML-RPC

logger.SubscribeTo(magentoProxy);
// call to Magento that I want to see the XML for request and responses to
logger.UnsubscribeFrom(magentoProxy);

Я не видел никаких проблем с XML, который был отправлен в Magento для вызовов API.Единственное, о чем я мог подумать, это запустить magento с подключенным отладчиком и посмотреть, что произойдет, когда он получит этот метод create, в файле Api.php или в стеке ранее, когда что-то испортится, но я этого не сделал.В то время у меня не было настроенной среды разработки для активной отладки кода Magento, и я не хотел тратить время на изучение этого аспекта прямо сейчас.

Что я сделал, чтобы обойти это, так это былопосле вызова добавьте некоторый код, чтобы создать счет-фактуру, который снова извлекает информацию из order_info из Magento и проверяет, выставлены ли все пункты заказа, и если нет, то выдает ужасную ошибку.Я полагаю, что таким образом, если в какой-то момент эта «ошибка» или что-то, из-за чего это происходит, будет исправлена ​​или изменится, я по крайней мере буду знать, влияет ли это на элементы заказа, получающие счета из этого вызова.

        // Get the order items that need to be invoiced
        // this.orderInfo is the XmlRpcStruct returned from a sales_order.info call
        XmlRpcStruct[] orderItems = this.orderInfo.Contains("items") ? (XmlRpcStruct[]) this.orderInfo["items"] : new XmlRpcStruct[] { };

        XmlRpcStruct orderItemsToInvoice = new XmlRpcStruct();
        Int32 orderItemId;
        Int32 qtyOrdered;
        Int32 qtyInvoiced;
        Int32 qtyToInvoice;

        foreach (XmlRpcStruct item in orderItems)
        {
            orderItemId = item.Contains("item_id") ? Convert.ToInt32(item["item_id"]) : 0;
            qtyOrdered = item.Contains("qty_ordered") ? Convert.ToInt32(Convert.ToDecimal(item["qty_ordered"])) : 0;
            qtyInvoiced = item.Contains("qty_invoiced") ? Convert.ToInt32(Convert.ToDecimal(item["qty_invoiced"])) : 0;
            qtyToInvoice = qtyOrdered - qtyInvoiced;

            orderItemsToInvoice[Convert.ToString(orderItemId)] = Convert.ToString(qtyToInvoice);
        }

        // Invoice This Order with a comment
        String newInvoiceId = magentoProxy.salesOrderInvoiceCreate(sessionId: sessionId, arguments: new Object[] {
                this.MageIncrementId, // Order increment ID
                "", // this should not need to be here, but for some reason if I want to include a comment
                    // on the invoice I have to thave this extra empty element before the array of order items
                    // if no comment is included on the invoice this extra element is not needed, rather weird, I can not explain it.
                orderItemsToInvoice, // array    itemsQty    Array of orderItemIdQty (quantity of items to invoice)
                "Automatically invoiced prior to CounterPoint import." // Invoice Comment (optional)
                //"0", // Send invoice on email (optional) defaults to false
                //"0" // Include comments in email (optional) defaults to false
            });

        // Invoice This Order without a comment
        String newInvoiceId = magentoProxy.salesOrderInvoiceCreate(sessionId: sessionId, arguments: new Object[] {
                this.MageIncrementId, // Order increment ID
                orderItemsToInvoice // array    itemsQty    Array of orderItemIdQty (quantity of items to invoice)
            });
...