1

次のようなサービス呼び出しスクリプトを開発しています。

<cfinvoke webservice="#ServiceURL#" method="AddCustomer" returnvariable="ResponseData" argumentcollection="#stAguments#">
    <cfinvokeargument name="api_key" value="#ServiceKey#" />
</cfinvoke>

明らかに、この呼び出しの前に満たされたstAguments構造。このコンテナに引数の 1 つを追加するのを忘れたか、間違った引数タイプを使用したとします。たとえば、無効なリクエストを作成したとします。ColdFusion は、キャッチできるが (文字どおりではなく) 読み取ることができない例外をスローします。

*Web service operation AddCustomer with parameters {postcode={12345},org_name={Terms test 7.79661762856},fax={},html={1},addr1={address1},firstname={sergey},city={Austin},country={},taxable={},notify={1},lastname={galashyn},addr2={},ssn={},api_key={8FE9AD0BCF2382D92A1080DB3AA62DB9},taxrate={0},terms={Net 15},active={},state={},salutation={Mr.},password={123},account_manager={1}} cannot be found.*

これらすべての引数を1つずつ手動でチェックすると、頭が壊れます。これが問題です。

たぶん、誰でもこれを簡単にするために何らかのテクニックを使用します。

この比較を自動化するある種のパーサーについても考えました。

どんな考えやアイデアでも感謝します。

ありがとうございました。

PS私の母国語ではなく、私の英語で申し訳ありません。私が十分に明確でないことを書いたかどうか尋ねてください。

編集:

明確にするために。サービスへのアクセスに問題はありません。私はそれの所有者であり、各メソッドのすべての引数とそのタイプを確実に知っています。

問題は、リクエストを作成するときにエラーメッセージを読むことだけです-メソッド引数コンテナを埋めます。

たとえば、メソッドには 10 個の引数があり、誤って 9 個追加してしまいました。CF のローカル インスタンスは、メソッドが見つからないというエラーをスローし、渡したフィールドの生のリスト (上で編集) を表示します。そして、それらをメソッド引数と 1 つずつ比較して、見逃しているものを見つける必要があります。

本当に、それは使いやすさと時間の節約の問題です。

4

3 に答える 3

2

本当に、それは使いやすさと時間節約の問題です。

さて、私があなたを正しく理解しているなら、あなたはあなたが持っているものをあなたが必要としているものと比較するための「デバッグ」方法が必要です。

あなたが「これがどうあるべきか」を持っていると仮定しましょう-struct:

<cfset WSargs = StructNew()>
<cfset WSargs.AddCustomer = StructNew()>
<cfset WSargs.AddCustomer.postcode  = "\d{5}">
<cfset WSargs.AddCustomer.org_name  = ".+">
<cfset WSargs.AddCustomer.fax       = ".*">
<cfset WSargs.AddCustomer.html      = "^[01]$">
<cfset WSargs.AddCustomer.addr1     = ".*">
<cfset WSargs.AddCustomer.firstname = ".*">
<cfset WSargs.AddCustomer.city      = ".*">
<cfset WSargs.AddCustomer.country   = ".*">
<cfset WSargs.AddCustomer.taxable   = ".*">
<cfset WSargs.AddCustomer.notify    = "^[01]$">
<cfset WSargs.AddCustomer.lastname  = ".*">
<cfset WSargs.AddCustomer.addr2     = ".*">
<cfset WSargs.AddCustomer.ssn       = ".*">
<cfset WSargs.AddCustomer.taxrate   = "^\d*$">
<cfset WSargs.AddCustomer.terms     = ".*">
<cfset WSargs.AddCustomer.active    = ".*">
<cfset WSargs.AddCustomer.state     = ".*">  
<cfset WSargs.AddCustomer.salutation= ".*">
<cfset WSargs.AddCustomer.password  = ".+">
<cfset WSargs.AddCustomer.account_manager = "^[01]$">

そして、これと比較する関数が必要ですargumentcollection

<cffunction name="CompareStructs" returntype="array" output="no">
  <cfargument name="template" type="struct" required="yes">
  <cfargument name="data"     type="struct" required="yes">

  <cfset var errors = ArrayNew(1)>
  <cfset var key = "">

  <cfloop collection="#template#" item="key">
    <cfif StructKeyExists(data, key)>
      <cfif REFind(template[key], ToString(data[key])) eq 0> 
        <cfset ArrayAppend(errors, "Field '#key#' has an invalid value.")>
      </cfif>
    <cfelse>
      <cfset ArrayAppend(errors, "Field '#key#' is missing.")>
    </cfif>
  </cfloop>

  <cfloop collection="#data#" item="key">
    <cfif not StructKeyExists(template, key)>
      <cfset ArrayAppend(errors, "Field '#key#' is not allowed.")>
    </cfif>
  </cfloop>

  <cfreturn errors>
</cffunction>

このように呼ばれます:

<cfset errors = CompareStructs(WSargs.AddCustomer, stAguments)>

<cfif ArrayLen(errors) eq 0>
  <cfinvoke 
    webservice="#ServiceURL#" 
    method="AddCustomer" 
    returnvariable="ResponseData" 
    argumentcollection="#stAguments#"
  >
    <cfinvokeargument name="api_key" value="#ServiceKey#" />
  </cfinvoke>
<cfelse>
  <cfdump var="#errors#" label="Errors calling AddCustomer()">
  <cfabort>
  <!--- or whatever --->
</cfif>
于 2009-02-05T17:48:14.257 に答える
0

最後に、サービスのテストに役立つ追加のコードを書き終えました。また、API ユーザーに CFML の例を提供し、これらのタスクを組み合わせる必要がありました。

コードサンプルを共有したいのですが、他の誰かが役に立つと思うかもしれません。

私は検証構造メソッドを使用しました(ただし、私の場合はオーバーヘッドであるため、正規表現を削除することで少し単純化しました-サービスは着信引数を検証し、エラーを報告します)。主なアイデアは、WSDL をプルして構造テンプレートを構築し、テスト データと比較することでした。また、さまざまなメソッドをテストするためのインターフェイスを備えた簡単なスクリプトを追加したため、サービスの変更をより迅速にテストできます。

したがって、ここにWSDL を取得して構造を比較するための UDF があります(私の XPath-fu は完璧ではない可能性があります:)

コードを公開するこの方法がルール違反にならないことを願っています。ここにすべてを投稿するのは良い考えではないと思いました。

Tomalakのアイデアに感謝します。

于 2009-02-09T20:33:36.910 に答える
0

あなたの頭痛の種は、入力を検証せずにメソッドに渡された値を受け入れるだけです。これは、メソッドに検証とオーバーロードを追加することで簡単に修正できます。

于 2009-02-05T15:31:36.140 に答える