2016-10-12 3 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 모듈에 익숙하지 않다. (다시 말하지만 꽤 오래된 모듈이다.)하지만 그것이 사용하는 것이다.

내가 생각하는 부분입니다 송장에 새로운 "라인"을 추가로 거래 : 현재 구조를 볼 수 있습니다

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 

:이 연구 한 후

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

을, SOAP :: Lite ~ 이 아닌은 utf8을 base64로 변환합니다 (예 : 가정) :

0을 사용하는 것이 좋습니다.

구조는 다음

<?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의 특정 하위 집합이 아니라고 생각할 때 일을 기본 64로 변환하기로 결정했다고 생각합니다. 당신은 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'], 
    }); 

. 나는 당신의 프로그램의 내부에서 그것이 Description이고 typelookup이 더티 밋 토스를 넣고 있다고 추측하고있다.

그리고 SOAP :: Lite는 재미가 없기 때문에 여기에있다. 나는 당신이 추적 할 수있는 것을보기 위해 SOAP :: Lite에 약간 해킹하여 시작할 것입니다. SOAP/Lite를 복사하십시오.오후 파일을 어딘가에 넣고 해당 위치를 @INC에 넣으십시오. 그렇게하면 원본 파일을 엉망으로 처리하지 않아도됩니다. 당신이 64 기수를 싶지 않을 경우 Description 유형을 선언하는 것은 (잠재적으로 작업뿐만 아니라 토끼의 구멍) 더 적절한 것 있지만

, 그것은 typelookup 에서 그 라인을 삭제하는 것처럼 간단 할 수 있습니다. 빠른 수정은 올바른 수정 작업을하는 동안 서있을 수 있습니다.

Perlmonk의 명상 How to convince SOAP::Lite to return UTF-8 data in responses as UTF-8?도 있습니다.

+0

답장을 보내 주셔서 감사합니다. 나는 그것이 단순하지 않다고 느꼈다. 나는 "정상적인"문자를 대체 할 것이라고 생각하고있다 :'{{{{{AAAaaaCcEEEEeeeeIIIiiOoooUUUuuu}}; 이것은 나 자신을위한 백엔드 인보이스 시스템 일 뿐이므로 적절한 억양이 필요하지 않습니다. –

관련 문제