2014-02-24 2 views
3

작성한 간단한 API에 대한 프록시로 사용하고있는 CFC (proxy.cfc라고 함)가 있습니다. 모든 것이 잘 진행되고 있으며 일부 파트너는 API를 효과적으로 사용하기 시작했습니다.유효성 검사 JSON을 CFC에 게시

그러나 데이터 게시를 시도하는 사이트 중 하나가 유효한 JSON을 보내지 않아이 오류를 정상적으로 처리하는 방법을 생각할 수 없습니다.

같이 보일 수있는 URL의 PARAM으로 게시 유효한 JSON 문자열 :

{"apicomponent":"proxyRemoteAdd","apimethod":"add","apiarguments":{"ph_num":1212,"rbpid":999,"ph_exch":555,"state":"HI","address_1":"123 Main Street","address_2":"","rmtid":"PON83","last_name":"Smith","test":1,"zip":999999,"first_name":"Joe","email":"[email protected]","city":"Honolulu","type":"SP","ph_area":995},"apiauthkey":"abc123"} 

그리고 그것은 잘 작동합니다. 그 문자열이 어떤 이유로 잘릴 경우

그러나 :

{"apicomponent":"proxyRemoteAdd","apimethod":"add","apiarguments":{"ph_num":1212,"rbpid":999,"ph_exch":555,"state":"HI" 

다음과 같이 나는 예외를 잡을 : 예외 : JSON 구문 분석 실패 :

JSON 문자열의 예기치 않은 끝이 내의 OnError에서오고있다 Application.cfc에 있습니다. 다음과 같이 Application.cfc에서 코드를 분리하기 위해 코드를 추가했습니다.

<cfif ARGUMENTS.EXCEPTION.MESSAGE IS "JSON parsing failure: Unexpected end of JSON string"> 
<!--- do some stuff here ---> 
</cfif> 

이런 종류의 오류를 처리하는 가장 좋은 방법은 무엇입니까? 어쨌든 proxy.cfc 파일에 전달하여 게시 클라이언트에 오류 메시지를 반환 할 수 있습니까? 지금 Application.cfc가 그것을 잡아서 proxy.cfc 파일에 접근하지 못하게합니다.

업데이트 - 여기에 몇 가지 구체적인 코드 샘플이 있습니다.

<cfhttp url="https://www.domain.com/api/proxy.cfc" method="post" result="httpResult" charset="UTF-8"> 
    <cfhttpparam type="url" name="method" value="apiauth"/> 
    <cfhttpparam type="url" name="argumentCollection" value="#jsData#"/> 
</cfhttp> 

는 "apiauth은"인증 및 프록시 역할을하는 CFC의 방법입니다 : 이것은 내가 테스트를 봤는데 데이터가 게시됩니다 방법을 설명하는 방법입니다. 인수 컬렉션은 아래와 같이 JSON 문자열입니다. 구성 요소 (다른 CFC), 해당 구성 요소의 메소드, AP에 액세스하는 사용자의 authkey 및 나열된 apicomponent로 전달되는 인수 및 데이터가 들어있는 apiarguments라는 JSON 문자열을 나열합니다.

프록시 CFC 파일은 다음과 같다 :이 시점에서

<cffunction name="apiauth" access="remote" returntype="any" output="false" returnFormat="JSON"> 
    <cfargument name="apicomponent" required="yes" type="string"/> 
    <cfargument name="apimethod" required="yes" type="string"/> 
    <cfargument name="apiauthkey" required="yes" type="string"/> 
    <cfargument name="apiarguments" required="yes" type="struct"/> 
    <cfset var LOCAL = {}/> 

    <cfif not isDefined("ARGUMENTS.apiauthkey")> 
     <cfreturn THIS.NewErrorResponse("Error 401 Malformed Request.") /> 
    </cfif> 
    <cfif not isDefined("ARGUMENTS.apicomponent")> 
     <cfreturn THIS.NewErrorResponse("Error 402 Malformed Request.") /> 
    </cfif>  
    <cfif not isDefined("ARGUMENTS.apimethod")> 
     <cfreturn THIS.NewErrorResponse("Error 403 Malformed Request.") /> 
    </cfif> 

     <cfset LOCAL.checkpwResult = FALSE/> 
     <cfset LOCAL.apicomponent = ARGUMENTS.apicomponent /> 
     <cfset LOCAL.apimethod = ARGUMENTS.apimethod /> 

는 다른 CFC를들은 API에 액세스 할 수 있는지 확인하기 위해 API 키와 사용자 ID 번호를 확인 액세스합니다. 모든 것이 거기서 확인하면 데이터가 올바른 구성 요소/메소드에 건네됩니다 다음 JSON 예외이 CFC 전에 발생되고있다 그러나

<cfinvoke component="#LOCAL.apicomponent#" method="#LOCAL.apimethod#" argumentcollection="#apiarguments#" returnvariable="LOCAL.Response.Data"/> 

심지어 Application.cfc 파일에 액세스 할 수 있습니다. proxy.cfc에 빠른 cfmail을 놓아서 인수를 덤프하고 메일로 보내는 경우에도 그 인수는 맞지 않습니다.

coldfusion.runtime.JSONUtils $ JSONParseOverflowException : JSON 구문 분석 실패 : coldfusion.runtime.JSONUtils $ ParserState.incrementOffset에서 JSON 문자열의 예기치 않은 종료 (JSONUtils.java:1999 여기

는 스택 추적의 덩어리입니다) ColdFusion에서의 coldfusion.runtime.JSONUtils.parseObject (JSONUtils.java:1074에서 coldfusion.runtime.JSONUtils.parseString (JSONUtils.java:1385)에서 coldfusion.runtime.JSONUtils $ ParserState.incrementOffset (JSONUtils.java:1980))에서 coldfusion.runtime에서 coldfusion.runtime.JSONUtils.parseStruct에서 .runtime.JSONUtils.parseStruct coldfusion.runtime.JSONUtils.parseObject에서 (JSONUtils.java:1178) (JSONUtils.java:1059) (JSONUtils.java:1178).JSONUtils.parseObject (JSONUtils.java:1059) at coldfusion.runtime.JSONUtils.parseJSON (JSONUtils.java:1028) at coldfusion.runtime.JSONUtils.deserializeJSON (JSONUtils.java:168) at coldfusion.runtime.JSONUtils.deserializeJSON (JSONUtils.java:1028) ColdFusion.filter.ApplicationFilter.invoke (ApplicationFilter.java:442)의 coldfusion.filter.ComponentFilter.invoke (ComponentFilter.java:193)에서 coldfusion.filter.FilterUtils.GetArgumentCollection (FilterUtils.java:50) in ColdFusion.filter.MonitoringFilter.invoke (MonitoringFilter.java:40) coldfusion.filter.PathFilter.invoke (PathFilter.java:112) at coldfusion.filter. ExceptionFilter.invoke (ExceptionFilter.java:94) coldfusion.filter.ClientScopePersistenceFilter.invoke (ClientScopePersistenceFilter.java:28) at coldfusion.filter.BrowserFilter.invoke (BrowserFilter.java:38) at coldfusion.filter.NoCacheFilter.invoke (NoCacheFilter .java : 58) co coldfusion.xml의 coldfusion.filter.DatasourceFilter.invoke (DataSourceFilter.java:22)에서 ldfusion.filter.GlobalsFilter.invoke (GlobalsFilter.java:38) coldfusion.xml.rpc.CFCServlet.invoke (CFCServlet.java:155) at coldfusion.xml .rpc.CFCServlet.doPost (CFCServlet.java:331) at javax.servlet.http.HttpServlet.service (HttpServlet.java:641), HttpServlet.service (HttpServlet.java:722)

+1

proxy.cfc는 어떻게 호출됩니까? 즉, 클라이언트가 URL 매개 변수를 직접 또는 다른 방법을 통해 전달합니까? 이벤트 사슬을 설명하기 위해 몇 가지 코드를 게시 할 수 있습니까? – Leigh

+1

'isJSON()'을 사용하여 확인한 다음 오류 메시지를 보낼 수 있습니까? –

+0

일부 코드 샘플 – Steve

답변

0

인수가 항상 JSON 문자열 인 경우 인수 유형을 string으로 변경 한 다음이를 (Application.cfc를 통해) 전달한 다음 isJSON을 사용하여 apiAuth 함수에서 유효성을 검사 할 수 있어야합니다) - 어쨌든 악의적 인 JSON에 대해 유효성을 검사해야하므로 isJSON()에 대해 초기에 확인하는 코드는 많지 않습니다. 이렇게하면 API가 의미있는 피드백을주고 모든 코드를 있어야합니다.

그러나 실제 구조체를 메서드에 전달한 다른 사용자가 있으면 작동하지 않습니다.

그리고 JSON 문자열이 잘리는 이유를 확실히 알고 싶을 것입니다. 짐작할 수 있듯이, 이스케이프 처리되지 않은 문자가 전달되어 전달되는 것이 좋습니다.

+0

고마워 마티.그 데이터를 전달하는 또 다른 사용자가 있습니다. - 필자는 예제를 통해 내 테스트를 수행하기 위해 설치 프로그램을 사용했기 때문에 argumentcollection = ''을 사용했습니다. 오류를 일으킨 사용자는 테스트 환경에서 정상적으로 작동 한 다음 프로덕션에 들어갔을 때이 시점에서 아무도 그 문제가 없다는 것을 알았으므로 그 사람의 의도는 무언가라고 가정 할 것입니다. – Steve

관련 문제