2010-11-11 18 views
10

Bir WSDL aldım ve bir SOAP isteği göndermek için onu kullanıyorum. Bu şuna benzer:Ad alanını SOAP isteğinden kaldırma

<?xml version="1.0"?> 
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <SOAP-ENV:Body> 
     <Calculate xmlns="urn:xx.WSDL.xxxxxWebService"> 
      <ContractdocumentIn> 
       <AL> 
       ...More XML... 

sorun hesaplayın elemanda xmlns="urn:xx.WSDL.xxxxxWebService" parçasıdır. Web servisi bunu kabul edemez.

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope" xmlns:col="http://example.com.service.xxx/"> 
    <SOAP-ENV:Body> 
     <col:Calculate> 
      <ContractdocumentIn> 
       <AL> 
        ...More XML... 

Yani, nasıl ikinci versiyonuna ilk isteğini değiştiririm: web hizmeti
Ben sadece sorunsuz bu isteği bulundu SoapUI kullanarak ... Böyle ad alanları sevmez? (Kirli hileler kullanarak olmadan!)
(bu doğru isteği biçiminde sonuçlanacaktır yeniden taşımaktan bir sorun değildir.) Yine




: hayır kirli hileler, izin istek akışını hack bunu değiştirme gibi ! Tamamen test etmedim iken


Ve C#/VS2010 ve Delphi 2010 da ben çağırmak çalışıyorum web hizmeti kullanmak mümkün gibi görünüyor. Java'da yazılmış gibi görünen bir web servisi. SoapUI Java'da yazılıyor, bu yüzden bir Java servisini konuşarak bir Java servisine sahibiz, ki bu sadece iyi çalışıyor gibi görünüyor. Ama başka bir müşteri var mı?
Neyse, iki tane daha etiket eklemek için zaman: "Java", çünkü bir Java servisi ve "vs2010" çünkü .NET de bu hizmeti beğenmiyor.
Ve bu hizmetin etrafına bir sarıcı yazmak üzereydim, umarım işe yarardı ... Olmaz. Yani bu çok ciddi bir kusur, muhtemelen bir Java hatası ...

+0

iyi şanslar. Kirli numaralara başvurmalıydım. –

+0

Evet, biliyorum. Muhtemelen kirli numaralar kullanarak çözebilirim, ancak yönetim buna katılmıyor. Yani kod temiz olmalı. –

+2

SOAP kodu, gönderilen XML'yi incelemeniz ve gerekiyorsa değiştirmeniz için kancalar sağlar. Manuel manipülasyonu açıkça destekler. Ve kod orada olurdu - post-build manipülasyon hakkında hiçbir şey "kirli". Otomatik kadar iyi olmayabilir, ama kimse bunun için endişelenmemeli. – mj2008

cevap

14

bir hizmet bekliyorsa:

<col:Calculate> 
    <ContractdocumentIn> 
     <AL> 

ve Delphi SABUN gönderiyor ...

<Calculate xmlns="urn:xx.WSDL.xxxxxWebService"> 
     <ContractdocumentIn> 
      <AL> 

... sorun ContractdocumentIn (Delphi XE kadar) vasıfsız bir eleman ve olmasıdır Delphi SOAP, bir operasyonun üst düzey unsurları olan niteliksiz unsurları desteklememiştir. Üst düzey elemanlar işlevin parametreleridir ve altta yatan elemanın niteliksiz olması gerektiği gerçeği saklanmamaktadır; özellikleri eşleyen öğeler için, IS_UNQL bayrağını saklamak için mülkün Dizinini kullanırız.

BTW, bir önek kullanmak gerekmez.

<Calculate xmlns="urn:xx.WSDL.xxxxxWebService"> 
     <ContractdocumentIn xmlns=""> 
      <AL> 

ikincisi daha ayrıntılı ama önek durumda eşdeğerdir: Hizmet da kabul (olmalı) olacaktır.

Delphi XE'de, ithalatçı, belirli bir parametrenin nitelenmemiş bir öğeyle eşleştiğini ve çalışma zamanının bu bilgiler üzerinde çalıştığı gerçeğini saklar. son zamanlarda bir iş parçacığı kadar geldiğinde haber grubundaki D2010 ve D2007 için XE uygulanmasına dayanan yamaları gönderdiniz:

birisi onlara erişmesi gerekiyorsa

https://forums.embarcadero.com/thread.jspa?threadID=43057

(onlar ekleri bölgede vardı ancak o lütfen bana e-posta gönderin ve bunları kullanıma sunacağım. [Embarcadero nokta com bbabet]

Alkış,

Bruneau

+1

Güzel açıklama! Teşekkürler. SOAP kütüphaneleri için D2007 yamaları ile D2005 kullanıyorum. D2007 yamalarındaki düzeltmelerin benim için çalışacağını düşünüyor musunuz? –

+4

Evet, gerekir. Gönderdiğim yama şu adreste: https://forums.embarcadero.com/thread.jspa?messageID=290788 – BruneauB

+0

Sorun yaşarsanız, lütfen bana WSDL'yi işaret et ve bana sor. Şerefe! – BruneauB

8

OMG! Çok fazla kahve ve bol uyku depravasyonu aldı ama problemimi çözmeyi başardım! Çok basit ...
Önce WSDL'yi beklendiği gibi içe aktarıyorum. Bu, birkaç test edilebilir sınıf oluşturacaktır. Daha sonra, farklı bir ad alanına ihtiyaç duyan her bir Travesti için, ObjectToSOAP() yöntemini geçersiz kılıyorum! (Ve WSDL kaynağına XMLIntf içerir.) Böyle kodu ile Benim durumumda Kumandalı türlerde birçok için:

function AL2.ObjectToSOAP(RootNode, ParentNode: IXMLNode; const ObjConverter: IObjConverter; const NodeName, NodeNamespace, ChildNamespace: InvString; ObjConvOpts: TObjectConvertOptions; out RefID: InvString): IXMLNode; 
begin 
    Result := inherited ObjectToSOAP(RootNode, ParentNode, ObjConverter, NodeName, '', '', ObjConvOpts, RefID); 
end; 

Delphi XE çalıştı Hangi.

function ContractdocumentInType.ObjectToSOAP(RootNode, ParentNode: IXMLNode; const ObjConverter: IObjConverter; const Name, URI: InvString; ObjConvOpts: TObjectConvertOptions; out RefID: InvString): IXMLNode; 

    procedure AlterChildren(Child: IXMLNode); 
    var 
    I: Integer; 
    begin 
    if (Child.NodeType = ntElement) then Child.SetAttributeNS('xmlns', '', ''); 
    for I := 0 to Pred(Child.ChildNodes.Count) do 
     AlterChildren(Child.ChildNodes[I]); 
    end; 

begin 
    Result := inherited ObjectToSOAP(RootNode, ParentNode, ObjConverter, Name, '', ObjConvOpts, RefID); 
    AlterChildren(Result); 
end; 

Bence, kesmek: Delphi 2007'de ben giriş tipine birimleri XMLIntf ve XMLDoc artı bu kodu kullanmak zorunda kaldı. Ama bu çok kirli değil. İçeriği kontrol etmek ve uygun ad alanlarını kullanıp kullanmadığını görmek için SOAP isteklerini ve yanıtlarını yakalamaya çalışmak biraz deneme. Ne yazık ki, XE Delphi Delphi 2007.

kadar bunda çok daha iyi bir iş yok Yine de, ben,


Btw, çıkışa col: eklemek için ... daha iyi çözümler için açık bu Q tutmak Aynı zamanda bu satırı WSDL RemClassRegistry.RegisterXSClass(Calculate, 'http://colan.ogconnect.service.wzp/', 'Calculate');'da değiştirmek zorundaydım: RemClassRegistry.RegisterXSClass(Calculate, 'http://colan.ogconnect.service.wzp/', 'cal:Calculate');. Sonuç, <cal:Calculate xmlns:cal="http://example.webservice/"> olur. Bununla birlikte, daha fazla şeyin yapılması gerekiyor: bu, xmlns:cal'u xml başlığına taşıyor. Ama şimdi olduğu gibi, benim için çalışıyor.


başka not: WSDL için aşağıdaki ayarları kullandım: 'literal params gevşeyin' 'yıkıcı üret', 'Bir Outparam dönüş olduğunu', 'Uyarı yorum', ' edebi türleri yayarlar', 'Genişletme için dize eşleştir'. Diğer seçenekler şunlardır: 'Türler ve arabirimler hakkında ayrıntılı bilgiler üretin', 'HTTP Bağlamaları ile portrelerin yoksay', 'Numaralandırma üyelerini doğrula', 'Hata türlerini içe aktar', 'İthalat üstbilgi türleri', 'İşlem dahil ve içe aktarılan şemalar', 'Oluştur sınıf türleri olarak sınıf takma adı ',' Çıkış Parametrelerine İzin Ver 've' Sürükle ve İsteğe Bağlı Öğeleri İşleme '. yayımlama türünde türünde yayınlar pratikti çünkü aradığım tek yöntemle ilgili bir sınıf oluşturur. Ne yazık ki, bu sınıf size çok yardımcı olmaz, ancak sınıf, ObjectToSOAP() yöntemini geçersiz kılarak, zarf içindeki üst düzeydeki SOAP isteğini değiştirmenize yardımcı olur.
Zarfın oluşturulması SOAPEnv birimindedir ve OPToSOAPDomConv biriminde kullanılır. Ne yazık ki, bu ek ad alanını eklemek için başlığı değiştirmek için zarfın kendisine erişmek için kolay bir yöntem bulamadım. Daha sonra, TSOAPDomConv sınıfını ek ad alanı ekleyen kendi sürümümle geçersiz kılabiliyordum. Ama kod şu anda benim için çalışıyor ve babamın söylediği gibi, beni programlamayı öğrendiğinde: Kırılmayan hiçbir şeyi düzeltmeyin.

+0

Umut verici görünüyor - ona bir girdap vereceğim. Bu büyük bir projede çok fazla zaman/acı biriktirebilir, bu yüzden tartışmaya ödül puanları vermekten mutluluk duyuyorum. –

+0

Gerçekten böyle bir çıkış verdiniz mi:

+0

Bu bana işe yarar bir yer verebilir, ancak AlterChildren işlevinde daha fazla iş yapmam gerekebilir. –

İlgili konular