2016-10-12 4 views
2

これは非常に古いPerlモジュールであることが分かりました(最後のアップデートから5年前)。私はそれがPerlにある必要がある私がやっているプロジェクトにとって有益だとわかりました。ボトムアップから始めるのではなく、これが基本を行うのに役立つことがわかった。私はすでにそれにいくつかのバグを修正しました - しかし、これは私が問題になっているモジュールであるNet :: Kashflow - utf8の説明では機能しません

把握することはできません:https://github.com/simoncozens/Net-KashFlow

問題と使用例は次のとおりです。

my $kf = Net::KashFlow->new(username => q|[email protected]|, password => "xxxx"); 

my $i = $kf->create_invoice({ 
    CustomerReference => "0123-1111111", CustomerID => 50108952, 
    CurrencyCode => "EUR" 
}) || die $!; 


$i->add_line({ 
    Quantity => 1, 
    Description => "íéó foo bar test", 
    Rate => 10, 
    VatAmount => 4, 
    VatRate => 0, 
    CurrencyCode => "GBP" 
}); 

こちらは追加されるが、 "説明" の値は、に変換される:

7enzIGZvbyBiYXIgdGVzdAの==

通常のa-z 0-9を使用すると、正常に動作し、正しく表示されます。問題は、base64へのエンコーディング、そしてもう一方の端で正しくデコードされていないようです。私の推測では、KashFlowはこれを "修正"するつもりではないので、実際にこの目的を達成する必要があります。私はSOAP :: Liteモジュールに精通していません(やはりかなり古いモジュールです)が、それが使用しているものです。

これは私が請求書に新しい「行」を追加することを扱っていると思い一部です。これを調査した結果

https://securedwebapp.com/api/service.asmx?op=InsertInvoiceLine

、:

InsertInvoiceLine => { 
    endpoint => 'https://securedwebapp.com/api/service.asmx', 
    soapaction => 'KashFlow/InsertInvoiceLine', 
    namespace => 'KashFlow', 
    parameters => [ 
     SOAP::Data->new(name => 'UserName', type => 'xsd:string', attr => {}), 
     SOAP::Data->new(name => 'Password', type => 'xsd:string', attr => {}), 
     SOAP::Data->new(name => 'InvoiceID', type => 'xsd:int', attr => {}), 
     SOAP::Data->new(name => 'InvLine', type => 'tns:InvoiceLine', attr => {}),=> {}) 
    ], # end parameters 
    }, # end InsertInvoiceLine 

あなたが現在の構造を見ることができますSOAP :: Liteに変換すると、utf8をbase64に変換することをお勧めします(私は仮定します)。

構造である:

<?xml version="1.0" encoding="utf-8"?> 
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soap:Body> 
    <InsertInvoiceLine xmlns="KashFlow"> 
     <UserName>string</UserName> 
     <Password>string</Password> 
     <InvoiceID>int</InvoiceID> 
     <InvLine> 
     <Quantity>decimal</Quantity> 
     <Description>string</Description> 
     <Rate>decimal</Rate> 
     <ChargeType>int</ChargeType> 
     <VatRate>decimal</VatRate> 
     <VatAmount>decimal</VatAmount> 
     <ProductID>int</ProductID> 
     <Sort>int</Sort> 
     <ProjID>int</ProjID> 
     <LineID>int</LineID> 
     <ValuesInCurrency>integer</ValuesInCurrency> 
     </InvLine> 
    </InsertInvoiceLine> 
    </soap:Body> 
</soap:Envelope> 

だから、そのボディ> InsertInvoiceLine> InvLine>説明のように見えます..しかし、私はその特定の文字列をエンコードしていないことを伝えることができるかわかりませんよ。

アドバイスをいただければ幸いです。大きなショーストッパーではない(すべてのデータがシステム内にあるので)、期待通りアイテム名を表示する方がはるかに良い/簡単でしょう:)

ありがとう!

答えて

2

私はこれがおそらくSOAP::Liteだと思うのですが、それはASCIIの特定のサブセットではないと思ったときに、物をBase64に変換することを決定します。あなたはSOAP::SerializerSOAP/Lite.pmで、このヒューリスティックを見つけることができます:誰がそれを告げなかったため、SOAP :: Liteはオブジェクトの型を知らないとき、これが戦場に出た

$self->typelookup({ 
     'base64Binary' => 
      [10, sub {$_[0] =~ /[^\x09\x0a\x0d\x20-\x7f]/ }, 'as_base64Binary'], 
     'zerostring' => 
      [12, sub { $_[0] =~ /^0\d+$/ }, 'as_string'], 

... many other types ... 
     'string' => 
      [100, sub {1}, 'as_string'], 
    }); 

。私はあなたのプログラムの腸の中でそれがSとtypelookupがその汚れた縫い目をつけていると推測しています。

そして、ここからは、SOAP :: Liteは楽しいものではありません。私はあなたが何を追跡することができるかを見るためにSOAP :: Liteをちょっとハッキングすることから始めます。 SOAP/Liteをコピーします。pmファイルをどこかに置き、その場所を@INCに入れてください。そうすれば、元のファイルを混乱させることはありません。

あなたはBASE64をたくない場合はDescriptionタイプを宣言することは(潜在的に、だけでなく、仕事のウサギの穴)より適切だろうが、それは、 typelookup でその行を削除するのと同じくらい簡単かもしれません。あなたが正しい修正をしている間に、速い修正ができます。

また、Perlmonkの瞑想How to convince SOAP::Lite to return UTF-8 data in responses as UTF-8?もあります。

+0

返信いただきありがとうございますブライアン。私はそれが簡単ではないと感じていました。私は "普通の"文字の代わりに 'tr {ÀÂÄAâäÇçÉÊÈÊéèÏÏÌÎïìîÔîÖÔÒöÜÜÛÙüûù} {AAAaaaCcEEEEeeeeIIIiiiOOOoooUUUuuu}を実行するつもりだと思っています。これは自分のためのバックエンド請求書システムに過ぎないので、彼らは適切なアクセントを持っています –

関連する問題