2011-03-08 4 views
0

오픈 소스 라이브러리 xmlrpc.net을 사용 중이고 연결 매개 변수 인 입력 매개 변수가있는 서비스를 호출하려고합니다.XMLRPC.Net 관련 배열을 어떻게 전달합니까?

통화 설명서 (나는 젠토라는 phpsite과 통합하려고하고 오류로 내가는 젠드 XMLRPC 라이브러리를 사용하여 알고 던지고있다.)

방법 이름 : sales_order_shipment.create 새로운 선적을 만들기 주문

반환 : 문자열 - 출하 증가 ID

인수 :

문자열 orderIncrementId - 주문 증가 ID ARRA (옵션) 문자열 설명 - 선적 주석 (선택 사항) 부울 전자 메일 - 전자 메일 플래그 전송 (선택 사항) 부울 includeComment - 전자 메일 플래그에 주석 포함 (선택 사항) - 연관 배열로 제공 할 항목 수 (order_item_id ⇒ qty)

그래서 닷넷에서 나는

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

를 작동하려면 다음을 얻을 수 있었다하지만 난 itemsQty 위해 안으로 통과해야하는지 닷넷 유형 알아낼 수 없습니다. new object [] {}는 작동하지만 배송 된 품목을 전달할 수 있어야합니다. 어떤 XML 형식이 xmlrpc.net을 사용하여 Associated Array로 매핑 될 수 있습니까?

답변

2

XML-RPC 요청을 생성하지 않아도 스펙이 명확하지 않지만 XmlRpcStruct를 다음과 같이 사용하는 방법은 어떻습니까?

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

내가 관련 방법 sales_order_invoice.create와 함께 연주하고 당신이 한 동일한 문제로 실행했습니다

1

(주문 ID를 가정 할 문자열입니다). 어떤 이유로 든 송장에 주석을 포함하면 서버에 전달 된 인수 배열에 추가 요소를 삽입해야한다는 것을 알았습니다.

Magento EE ver을 실행 중입니다. 1.11.0.2 C# 및 XML-RPC.Net v2 라이브러리 (CookComputing.XmlRpcV2.2.ll)를 사용하여 Magento와 데이터를 통합합니다.

빈 인보이스에 대한 설명을 알아 채어이 해결 방법을 발견 한 것은 Send invoice on email (optional) 필드에 대해 입력 한 값인 "0"이며 주석 앞에 빈 요소를 삽입하기로 결정했습니다. 하지만 항목은 여전히 ​​송장을받지 못했습니다. 그런 다음 항목 목록 앞에 빈 요소를 이동하고 모든 것이 작동했습니다. API /app/code/core/Mage/Sales/Model/Order/Invoice/Api.php에 대한 코드를 확인했지만 이것이 어디서 또는 왜 그런지를 찾을 수 없었습니다. 내 유일한 추측은 XML-RPC 요청을 구문 분석하는 라이브러리와 관련이 있다는 것이이 호출이 다른 인수의 중간에 배열을 가지고 있기 때문에 무언가를 얻지 못한다는 것입니다.내가 사용했던

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

그럼 언제 난 그냥 전에 이러한 호출을 넣어 무엇을 요청 응답 통화중인 표시 할 XML-RPC 로거를이 진단을 위해 노력 속과 XML- 후

RPC 호출

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

API 호출을 위해 Magento에 전송 된 XML에는 아무런 문제가 없습니다. 내가 생각할 수있는 유일한 다른 것은 디버거가 부착 된 상태에서 magento를 시작하고 Api.php 파일이나 스택에있는 메소드를 생성 할 때 일어나는 일을 지켜 보는 것입니다. 먼저 스택이 엉망이되어 버렸지 만, 당시 Magento 코드의 활성 디버깅을위한 내 dev 환경 설정이 있었고 지금 당장의 일들을 파헤치는 시간을 보내고 싶지 않았습니다.

해결 방법 Magento에서 order_info를 다시 가져 와서 주문의 모든 항목에 대해 인보이스가 발행되었는지 확인하기 위해 인보이스를 작성한 후 코드를 추가하는 것이 좋습니다. 추악한 오류를 일으킨다. 내가 어떤 점에서이 "버그"또는 이것이 일어나는 원인이 무엇이든간에 수정되거나 변경되면이 호출에서 주문 항목에 영향을 주는지 최소한 알게 될 것입니다.

 // 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) 
      }); 
+0

감사합니다. XmlRpcStruct가 정말 도움이되었습니다. – Eleasar

+0

Magento EE 1.13은 API 호출에 많은 버그를 수정했습니다. 또한 EE 1.13에서 SOAP 예제를 쉽게 얻을 수 있었기 때문에 XML-RPC를 사용하는 대안이 있습니다. SOAP 및 EE 1.13을 사용하여 개념 증명 프로젝트 (선물 카드로 작업)를 수행했으며 코드 작성이 훨씬 간단했습니다. Magento API 호출을 위해 XML-RPC에서 SOAP로 전환하고 싶습니다. – mttjohnson