Soru ActionScript 3'te "Null" (gerçek bir soyadı!) SOAP web hizmetine nasıl geçirilir?


Soyadı Null olan bir çalışanımız var. Çalışan adı arama başvurusu, soyadı arama terimi olarak kullanıldığında öldürülür (ki bu çoğu zaman oldukça sık görülür). Alınan hata (teşekkürler Fiddler!):

<soapenv:Fault>
   <faultcode>soapenv:Server.userException</faultcode>
   <faultstring>coldfusion.xml.rpc.CFCInvocationException: [coldfusion.runtime.MissingArgumentException : The SEARCHSTRING parameter to the getFacultyNames function is required but was not passed in.]</faultstring>

Sevimli, ha?

Parametre tipi string.

Ben kullanıyorum:

  • WSDL (SOAP)
  • Flex 3.5
  • ActionScript 3
  • ColdFusion 8

Hata olduğunu unutmayın değil webservice bir ColdFusion sayfasından bir nesne olarak çağrıldığında ortaya çıkar.


4475
2017-12-16 00:42


Menşei


Bu, belirli bir problemle size yardımcı olmayabilir, ancak SOAP 1.2 null değerlere izin verir, bkz. w3.org/TR/2001/WD-soap12-20010709/#_Toc478383513 - JensG
Dave Null'u içerdiğini hissediyorum. - George Gibson
En azından Chuck Norris'i içermiyor. İşte ondan neden ondan uzak durun: codesqueeze.com/... - SDsolar
Çalışan adını değiştirmeyi düşünüyor mu? - Tatranskymedved
BBC'de başvurulanlar: bbc.com/future/story/... - biziclop


Cevaplar:


 Takip etmek

İlk başta bunun bir zorlama hatası olduğunu düşündüm. null zorlanıyordu "null" ve bir test "null" == null geçiyordu. Değil. Çok yakındım ama çok ama çok yanılmışım. Bunun için üzgünüm!

Ben çok yaptım wonderfl.net üzerinde kafa karıştırıcı ve kod içinde izleme mx.rpc.xml.*. 1795 satırında XMLEncoder (3,5 kaynağında), setValue, tüm XMLEncoding aşağı kaynar

currentChild.appendChild(xmlSpecialCharsFilter(Object(value)));

esas olarak aynı olan:

currentChild.appendChild("null");

Bu kod, orijinal kemanıma göre boş bir XML öğesi döndürüyor. Ama neden?

 Sebeb olmak

Yorum yazarı Justin Mclean'a göre FLEX-33664, aşağıdaki suçlu (benim son iki test bakın keman bunu doğrulayan):

var thisIsNotNull:XML = <root>null</root>;
if(thisIsNotNull == null){
    // always branches here, as (thisIsNotNull == null) strangely returns true
    // despite the fact that thisIsNotNull is a valid instance of type XML
}

Ne zaman currentChild.appendChild dize geçti "null"İlk önce metni bir kök XML öğesine dönüştürür nullve sonra bu öğeyi boş literale karşı test eder. Bu zayıf bir eşitlik sınamasıdır, bu nedenle null içeren XML boş türüne zorlanır veya null türü "null" dizesini içeren bir kök xml öğesine zorlanır ve testin başarısız olduğu yerde geçmesi gerekir. Bir düzeltme her zaman kullanmak olabilir katı eşitlik "nullness" için XML'i (veya gerçekten bir şey) kontrol ederken test eder.

Çözüm

Düşünebildiğim tek mantıklı çözüm, bu hatayı ActionScript'in her türlü versiyonuna sabitlemekten ibaret, "null" ve "null" için alanları test etmektir. onları kaçmak CDATA değerleri. 

CDATA değerleri, kodlama / kod çözme sorunlarına neden olabilecek tüm bir metin değerini değiştirmek için en uygun yoldur. Örneğin, Hex kodlaması bireysel karakterler içindir. Bir öğenin tüm metninden kaçtığınızda CDATA değerleri tercih edilir. Bunun en büyük sebebi, insan okunabilirliğini sürdürmesidir.


1049
2017-08-01 17:31





Üzerinde xkcd not, Bobby Tables web sitesi dahil olmak üzere çeşitli dillerde SQL sorgularında kullanıcı verilerinin (bu durumda "Boş" dizesinin) yanlış yorumlanmasından sakınmak için iyi bir tavsiyeye sahiptir. Soğuk füzyon.

Bu sorunun sorununun kaynağı olduğu net değildir ve ilk cevaba yapılan bir yorumda (çözümün bir yapıya katılması) yapılan bir çözümde verilen çözümün, bunun başka bir şey olması muhtemel görünüyor.


286
2018-04-27 20:00





Sorun Flex'in SOAP kodlayıcısında olabilir. SOAP kodlayıcısını Flex uygulamanızda genişletmeyi deneyin ve boş değerin nasıl ele alındığını görmek için programda hata ayıklayın. Benim tahminim şu şekilde geçti: NaN (Numara Değil). Bu, SOAP mesajı unmarshalling işlemini bir süre mahvedecek (özellikle de JBoss 5 sunucu ...). SOAP kodlayıcının uzatıldığını ve NaN'nin nasıl ele alındığına dair açık bir kontrol gerçekleştirmeyi hatırlıyorum.

(Bir yan not, çalışan kimliği Null ise yararlı bir şey yapmak için bekliyoruz, bu bir doğrulama sorunu değil mi? Ben, zorlukla ihtiyacım var biliyorum çünkü ...)


235
2018-01-16 08:13



name = "Null" tabiki kullanışlıdır ve NaN ile nasıl ilişkili olduğunu göremiyorum. - eckes


@ doc_180 doğru kavrama sahipti, ancak sayılara odaklanmışken, orijinal posterin dizeleriyle ilgili sorunları vardı.

Çözüm değiştirmek mx.rpc.xml.XMLEncoder dosya. Bu hat 121

    if (content != null)
        result += content;

[Flex 4.5.1 SDK'ya baktım; satır numaraları diğer versiyonlarda farklılık gösterebilir]

Temel olarak, 'içerik boş' olduğu için onaylama başarısız olur ve bu nedenle argümanınız giden SOAP Paketine eklenmez; böylece eksik parametre hatasına neden olur.

Doğrulamayı kaldırmak için bu sınıfı genişletmeniz gerekiyor. Ardından, zincirdeki büyük bir kartopu var, değiştirilmiş XMLEncoder'ı kullanmak için SOAPEncoder'ı değiştirdikten sonra değiştirilmiş SOAPEncoder'ı kullanmak için Operation'ı değiştirip, daha sonra alternatif Operasyon sınıfınızı kullanmak için WebService'i moidfying.

Birkaç saat harcadım, ama devam etmeliyim. Muhtemelen bir iki gün sürecek.

XMLEncoder satırını düzeltebilir ve kendi sınıfınızı kullanmak için bir miktar maymun yaması yapabilirsiniz.

ColdFusion ile RemoteObject / AMF kullanmaya geçerseniz, null'un sorunsuz bir şekilde geçtiğini de ekleyeceğim.


11/16/2013 güncelleme:

RemoteObject / AMF ile ilgili son yorumuma bir daha yeni ekledim. CF10 kullanıyorsanız; Daha sonra, bir nesnede boş bir değere sahip olan özellikler, sunucu tarafı nesnesinden kaldırılır. Bu yüzden, özellik varlığına erişmeden önce varlığını kontrol etmelisiniz ya da bir çalışma zamanı hatası alacaksınız. Şuna benziyor:

<cfif (structKeyExists(arguments.myObject,'propertyName')>
 <!--- no property code --->
<cfelse>
 <!--- handle property  normally --->
</cfif>

Bu CF9'dan davranışlarda bir değişiklik; boş değerlerin boş dizelere dönüşeceği yer.


12/6/2013 tarihinde düzenle

Burada null'ların nasıl ele alındığı hakkında bir soru olduğu için, bir "null" dizesinin ayrılmış sözcük null ile nasıl ilişkilendirileceğini göstermek için hızlı bir örnek uygulamadır.

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
               xmlns:s="library://ns.adobe.com/flex/spark" 
               xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600" initialize="application1_initializeHandler(event)">
    <fx:Script>
        <![CDATA[
            import mx.events.FlexEvent;

            protected function application1_initializeHandler(event:FlexEvent):void
            {
                var s :String = "null";
                if(s != null){
                    trace('null string is not equal to null reserved word using the != condition');
                } else {
                    trace('null string is equal to null reserved word using the != condition');
                }

                if(s == null){
                    trace('null string is equal to null reserved word using the == condition');
                } else {
                    trace('null string is not equal to null reserved word using the == condition');
                }

                if(s === null){
                    trace('null string is equal to null reserved word using the === condition');
                } else {
                    trace('null string is not equal to null reserved word using the === condition');
                }

            }

        ]]>
    </fx:Script>
    <fx:Declarations>
        <!-- Place non-visual elements (e.g., services, value objects) here -->
    </fx:Declarations>
</s:Application>

İz çıktısı:

null string! = condition kullanarak null ayrılmış kelimeye eşit değildir

null string == koşulunu kullanarak null ayrılmış kelimeye eşit değildir

null string === koşulunu kullanarak null ayrılmış kelimeye eşit değildir


125
2018-05-03 15:51



@ Reboog711 Çalışanın soyadı, kelimenin tam anlamıyla "Boş" dizesi, "Benim adım Pat Null" şeklindedir. Cevabınız çalışanın soyadını geçemez. Sen cevap sadece "Null" Ben Burns tarafından açıklandığı gibi appendChild () yöntemi tarafından null dil kavramına uygunsuz bir şekilde zorlanmış olduğu gerçeğini gizler. Sonuç hala sistemin Bay veya Bayan Null ile başa çıkamamasıdır. - Maxx Daymon
@MaxxDaymon Sanırım cevabımın gerçekte ne olduğunu yanlış anlıyorsunuz. Bir çözüm sunmuyor; ancak sorunun neden oluştuğuna dair bir açıklama; ve Flex Framework'den ilgili kodu koyar. Daha yeni düzenlemem belki de yanlış yazılmış; alternatif bir yaklaşımı tartıştığı ve doğrudan orijinal soruyla ilgili olmadığı için. - JeffryHouser
Doğru yoldasınız ama kodun bu noktasındasınız content dize "null"ve "null" == null, false değerini döndürür, böylece testin amacı gerektiği gibi davranır. Bunun yerine, sorunun XML.appendChild'in bir dize argümanı nasıl işlediğine ve yalnızca "null" dizesini içeren bir kök XML öğesinin bir değişmeze nasıl zorlanabileceğinin bir karışımı olduğuna inanıyorum. null. - Ben Burns
@ Reboog711 Kemanıma bir bakın. "null"! = null` dönen true Burada istenen davranışdır. Tersi gerçekleşirse, bu, kodlama işleminden "null" dizesini atıyordu, bu aslında sorunun nedenidir. Ancak bu sınama başarılı olduğu için kodlayıcı XML.appendChild bir baskı hatası nedeniyle onu atana kadar devam eder. - Ben Burns
Telaşa gerek yok. Gerçek sorunu görmek istiyorsanız ekleyin var xml:XML = <root>null</root>; var s:String = (xml == null) ? "wtf? xml coerced to null?!!" : "xml not coerced to null."; trace(s); kod örneğinize. - Ben Burns


Tüm karakterleri onaltılık varlık eşdeğerine dönüştürün. Bu durumda, Null dönüştürülecek &#4E;&#75;&#6C;&#6C;


62
2018-04-30 19:03



Lütfen bunu yapma. CDATA, tüm bir metin bloğundan kurtulmanız gereken durumlarda kullanılmak üzere yaratıldı. - Ben Burns
Yanılıyor olabilirim ama sanmıyorum çünkü azalıyordum sizin Çözüm, bunun nasıl çalışması gerektiğidir. Ayrıca, çözümün çeşitliliği ile ortaya konduğu gibi, bariz bir çözüm bulunmadığı için, problemin bir heuristik çözüm çağrısını aklınızda bulundurmanız gerekir. Son olarak, CF'yi bilmiyorum, bir kod çözücü sadece <message> <! [CDATA [NULL]]> </ message> iç metnini <message> NULL </ in < message>? Eğer öyleyse, o zaman CDATA gerçekten bir çözüm mü? - doogle
Düşündüm çünkü bu bir anti-desen. Bu durumda hata CF'de değil, ActionScript'te. Bununla birlikte, yine de iyi bir puan yükseltmek. CDATA kodlaması için kemanıma bir test ekleyeceğim. - Ben Burns


Bir tasvir null değeri ActionScript dize verecek "NULL". Şüphe duyduğum şudur ki, birisi dizgenin şifresini çözmek için iyi bir fikir olduğuna karar verdi. "NULL" gibi nullBurada gördüğünüz kırılmaya neden oluyor - muhtemelen null Nesneleri ve veritabanında dizeleri almak istemedikleri zaman (bu tür bir hata için de kontrol ettiğinizden emin olun).


49
2018-04-28 20:15



Evet, burada daraltmak için daha fazla hata ayıklaması gerektiren bir dizi olasılık var. 1) Burada kullanılan WSDL, "NULL" ile bir string değeri ve gerçek bir boş değer (veya atlanmış) değeri arasında ayrım yapmak için yeterince etkileyici midir? 2) Eğer öyleyse, istemcinin soyadını doğru olarak kodlamasıdır (bir dize olarak ve boş bir harf olarak değil) 3) Eğer öyleyse, servis "NULL" yi bir dize olarak düzgün bir şekilde yorumluyor veya onu null değerine zorluyor mu? - pimlottc


Bir kesmek olarak, istemci tarafında özel bir işlem yapmayı düşünebilirsiniz, 'Boş' dizesini asla oluşmayacak bir şeye dönüştürürsünüz, örneğin, XXNULLXX ve sunucuya geri dönersiniz.

Bu hoş değil, ancak böyle bir sınır durumu için sorunu çözebilir.


36
2018-04-28 08:43



XXNULLXX de bir isim olabilir. Sen bilmiyorsun Belki de Endonezya'daki kişilerin soyadı yok ve gerektiğinde soyadı olarak XXX varyantı kullanıyor. - gb.
Ya da yanno, her zaman CDATA var ... - Ben Burns
Aynı kavramı, ancak veritabanındaki tüm isimleri güncelleyin ve sonra bir karakterle (1Null, 1Smith) önsöz. İstemcideki karakteri kapat. Elbette bu, Reboog'un çözümünden daha akılcı bir iş olabilir. - bobpaul
@BenBurns Evet, ama eğer çocuğumu adlandırmak istersem &#78;&#117;&#108;&#108;? - Sirens
@Sirens Bu sorun değil. Eğer ismim "<& quot;>" ise, "& amp; & amp; & amp; & gt; & quot; Asıl sorun, isimler için bir kara liste kullanıyormuş gibi davranan bir uygulama. - Mr Lister


Peki, Flex'in SOAP Encoder uygulamasının null değerlerini hatalı seri hale getirdiğini tahmin ediyorum. Onları bir String Null olarak serileştirmek iyi bir çözüm değildir. Resmi olarak doğru sürüm, boş değer olarak geçmek gibi görünüyor:

<childtag2 xsi:nil="true" />

Yani "Boş" değeri, tam olarak aradığınız şey olan geçerli bir dizgeden başka bir şey olmaz.

Apache Flex'te bu düzeltmeyi başarmak çok zor olmamalı. Bir Jira meselesini açmanızı veya apache-flex e-posta listesindeki kişilere ulaşmanızı tavsiye ederim. Ancak bu sadece müşteri tarafını düzeltecektir. ColdFusion'ın bu şekilde kodlanmış boş değerlerle çalışıp çalışmayacağını söyleyemem.

Ayrıca bkz. Radu Cotescu'nun blog yazısı SoapUI isteklerinde boş değerler nasıl gönderilir?.


30
2017-07-17 07:56



Burada iyi bir bilgi var, bu yüzden reddetmeyeceğim, ama bir yorum yapmaya değer olduğunu düşündüm. Varsayılan olarak, XMLEncoder.as aslında doğru bir kodlayacak null ayarlayarak doğru şekilde xsi:nil="true" eleman üzerinde. Sorun aslında ActionScript'te olduğu gibi görünüyor XML kendini yazmak (kodlayıcı değil) dizgiyi işliyor "null". - Ben Burns


Bu bir klud, ama asgari bir uzunluk olduğunu varsayarak SEARCHSTRINGörneğin 2 karakter, substring  SEARCHSTRING ikinci karakterde parametre ve bunun yerine iki parametre olarak iletin: SEARCHSTRING1 ("Nu") ve SEARCHSTRING2 ("ll").  Concatenate Sorguyu veritabanına yürütürken tekrar bir araya getirin.


21
2018-04-28 19:48



Bu tür kludlardan kaçınmak için XML spesifikasyonuna CDATA eklenmiştir. - Ben Burns
CDATA ile "Boş" dan kaçmaya gerek yoktur, XML'de boş bir anahtar kelime diye bir şey yoktur. - eckes
@Eckes ile katılıyorum. Neden tüm bu CDATA konuşmasının olduğunu anlamıyorum. CDATA yalnızca XML'de özel anlamı olan karakterlerden kaçmak için kullanışlıdır. hiçbiri: n, u, l XML'de özel bir semantik var. "NULL" ve "<! [CDATA [NULL]]>" bir XML ayrıştırıcısıyla aynıdır. - jasonkarns
@jasonkarns - Orada% 100 katılıyorum meli Dize / metin düğümü hakkında özel bir şey olmamak NULLama akıl almaz olmak <blah>null</blah> ve <blah><![CDATA[null]]>XML ayrıştırıcısıyla aynı değildir. Onlar meli Aynı sonuçları üretmek, ancak bunları işlemek için mantık akışı farklıdır. Esnek XML uygulamasında bu hataya bir çözüm olarak istismar ediyoruz. Metnin okunabilirliğini koruduğu ve diğer ayrıştırıcılar için hiçbir yan etkisi olmadığı için bunu diğer yaklaşımlar üzerinde savunuyorum. - Ben Burns