작성한 간단한 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)
proxy.cfc는 어떻게 호출됩니까? 즉, 클라이언트가 URL 매개 변수를 직접 또는 다른 방법을 통해 전달합니까? 이벤트 사슬을 설명하기 위해 몇 가지 코드를 게시 할 수 있습니까? – Leigh
'isJSON()'을 사용하여 확인한 다음 오류 메시지를 보낼 수 있습니까? –
일부 코드 샘플 – Steve