<ph type="x-smartling-placeholder"></ph>
현재 Apigee Edge 문서를 보고 있습니다.
Apigee X 문서. 정보
증상
클라이언트 애플리케이션이 HTTP 상태 코드 500 Internal Server Error
를 가져옵니다.
API 호출에 대한 응답으로 오류 코드 protocol.http.BadFormData
오류 메시지
클라이언트 애플리케이션은 다음과 같은 응답 코드를 받습니다.
HTTP/1.1 500 Internal Server Error
또한 다음과 같은 오류 메시지가 표시될 수 있습니다.
{ "fault":{ "faultstring":"Bad Form Data", "detail":{ "errorcode":"protocol.http.BadFormData" } } }
양식 데이터
이 문제를 해결하기 위해 자세히 알아보기 전에 양식 데이터가 무엇인지 알아보겠습니다.
양식 데이터는 일반적으로 요소가 포함된 HTML 양식을 통해 사용자가 제공하는 정보입니다. 텍스트 입력 상자, 버튼 또는 체크박스와 같은 구성요소를 포함할 수 있습니다. 양식 데이터는 일반적으로 키-값 쌍을 사용합니다.
양식 데이터 전송
- Content-Type: application/x-www-form-urlencoded
<ph type="x-smartling-placeholder">
- </ph>
- 양식 데이터의 크기가 작은 경우 데이터는 다음을 사용하여 키-값 쌍으로 전송됩니다.
<ph type="x-smartling-placeholder">
- </ph>
- 아래의 규칙에 따라 인코딩된 두 키의 문자는 <ph type="x-smartling-placeholder"></ph> 양식 - 섹션 17.13.4.1
- 헤더
Content-Type: application/x-www-form-urlencoded
양식 데이터가 포함된 샘플 요청:
curl https://HOSTALIAS/somepath -H "Content-Type: application/x-www-form-urlencoded" -d "username=abc@google.com&pasword=secret123"
- 키와 값 모두에서 영숫자가 아닌 문자는 모두
<ph type="x-smartling-placeholder"></ph>
퍼센트 인코딩, 즉 문자 3줄로 표현됩니다.
퍼센트 기호 뒤에 2자리 16진수로 구성된
%HH
특정 문자의 ASCII 코드를 나타냅니다. - 따라서 양식 데이터에서 퍼센트 기호 (
%
)는 허용되지만 특수 이스케이프 시퀀스의 시작으로 해석됩니다. 따라서 양식 데이터가 키 또는 값에 퍼센트 기호 (%
)가 포함되어 있으면 퍼센트 기호를 위한 ASCII 코드를 나타내는%25,
로 표현 (%
)자(영문 기준)입니다.
- 양식 데이터의 크기가 작은 경우 데이터는 다음을 사용하여 키-값 쌍으로 전송됩니다.
<ph type="x-smartling-placeholder">
- Content-Type: multipart/form-data
대량의 바이너리 데이터 또는 비 ASCII가 포함된 텍스트를 전송하려는 경우 그런 다음 문자 시퀀스를 사용해
Content-Type:
multipart/form-data에 설명된 대로 <ph type="x-smartling-placeholder"></ph> Forms - 섹션 17.13.4.2
가능한 원인
이 오류는 다음 조건이 모두 충족된 경우에만 발생합니다.
- 클라이언트가 Apigee Edge로 보낸 HTTP 요청에는 다음이 포함됩니다.
<ph type="x-smartling-placeholder">
- </ph>
Content-Type: application/x-www-form-urlencoded
및- 퍼센트 기호 (
%
) 또는 퍼센트 기호가 있는 양식 데이터 (%
) 뒤에 잘못된 16진수 문자가 표시됨 <ph type="x-smartling-placeholder"></ph> 양식 - 17.13.4.1항.
Apigee Edge의 API 프록시는 임의의 문자를 포함하는 특정 양식 매개변수를 읽습니다. ExtractVariables 또는 할당 메시지 정책
예를 들어 양식 데이터에 퍼센트 기호(
%
)가 있는 그대로 포함되어 있고 인코딩) 또는 퍼센트 기호 (%
) 뒤에 잘못된 16진수가 옵니다. 문자를 넣으면 이 오류가 발생합니다.이 오류가 발생할 수 있는 원인은 다음과 같습니다.
원인 설명 다음에 관한 문제 해결 안내 요청의 양식 매개변수에 허용되지 않는 문자가 있습니다. 클라이언트가 HTTP 요청의 일부로 전달하는 양식 매개변수에는 허용되지 않는 문자는 사용하지 마세요. 에지 퍼블릭 및 프라이빗 클라우드 사용자
일반적인 진단 단계
다음 도구/기술 중 하나를 사용하여 이 오류를 진단합니다.
API 모니터링
<ph type="x-smartling-placeholder">API 모니터링을 사용하여 오류를 진단하려면 다음 안내를 따르세요.
- <ph type="x-smartling-placeholder"></ph> 다음 권한이 있는 사용자로 Apigee Edge UI에 로그인 적절한 역할을 해야 합니다.
문제를 조사하려는 조직으로 전환합니다.
- 분석 > API 모니터링 > 조사 페이지를 엽니다.
- 오류가 관찰된 특정 기간을 선택합니다.
시간을 기준으로 결함 코드를 표시합니다.
<ph type="x-smartling-placeholder">오류 코드가
protocol.http.BadFormData
인 셀을 선택하세요. 다음과 같습니다.(큰 이미지 보기)
오류 코드(
protocol.http.BadFormData
)에 대한 정보는 다음과 같습니다. 표시됩니다.(큰 이미지 보기)
로그 보기를 클릭하고 실패한 요청의 행을 펼칩니다.
- 로그 창에서 다음 세부정보를 확인합니다.
<ph type="x-smartling-placeholder">
- </ph>
- 상태 코드:
500
- 오류 소스:
proxy
- 오류 코드:
protocol.http.BadFormData
- 오류 정책:
extractvariables/EV-ExtractFormParams
- 상태 코드:
- 결함 소스가
proxy
이면 결함 코드는 다음과 같습니다.protocol.http.BadFormData
및 결함 정책이 비어 있지 않으면 오류에 표시된 특정 정책 중에 오류가 발생했음을 나타냅니다. 정책이 포함된 양식 데이터 (양식 매개변수)를 읽거나 추출했습니다. 허용되지 않는 문자는 사용하지 마세요. - 이 예시에서 X-Apigee-fault-policy는
extractvariables/EV- ExtractFormParams,
이므로 양식을 읽거나 추출하는 중에 EV-ExtractFormParams가 실패했습니다. 매개변수입니다.
추적 도구
<ph type="x-smartling-placeholder">Trace 도구를 사용하여 오류를 진단하는 방법은 다음과 같습니다.
- 추적 세션 사용 설정
그리고 다음 중 한 가지 조건 충족.
<ph type="x-smartling-placeholder">
- </ph>
500 Internal Server Error
오류가 발생할 때까지 기다립니다.- 문제를 재현할 수 있는 경우 API를 호출하여 문제를 재현합니다.
500 Internal Server Error
모든 FlowInfos 표시가 사용 설정되어 있는지 확인합니다.
- 실패한 요청 중 하나를 선택하고 trace를 검토합니다.
- 추적의 여러 단계를 살펴보고 장애가 발생한 위치 찾기 수 있습니다.
일반적으로 아래와 같은 정책 중 하나에서 오류를 확인할 수 있습니다.
위의 샘플 trace에서는
EV-ExtractFormParams
라는 ExtractVariables 정책입니다.실패한 특정 정책 다음에 나오는 Error라는 흐름으로 이동합니다.
- 트레이스에서 다음 값을 확인합니다.
오류:
Bad Form Data
주:
PROXY_REQ_FLOW
error.class:
com.apigee.rest.framework.BadRequestException
- 오류 값
Bad Form Data
는 양식이 매개변수에 사용할 수 없는 일부 문자가 있습니다. PROXY_REQ_FLOW,
상태 값은 다음을 나타냅니다. API 프록시의 요청 흐름에서 오류가 발생했습니다.
- 오류 값
- 트레이스에서 AX (애널리틱스 데이터 기록됨) 단계로 이동하여 클릭합니다. 있습니다.
아래로 스크롤하여 단계 세부정보 - 오류 헤더 섹션으로 이동한 다음 X-Apigee-fault-code, X-Apigee-fault-source, 및 X-Apigee-fault-policy가 아래처럼 표시됩니다.
X-Apigee-fault-code와 X-Apigee-fault-source의 값은 는 각각
protocol.http.BadFormData
및policy
입니다. X-Apigee-fault-policy는 비어 있지 않습니다. 이는 오류가 X-Apigee-fault-policy에 표시된 특정 정책이 양식 데이터 (양식 매개변수)를 읽거나 추출하는데, 여기에는 사용이 허용되지 않습니다.응답 헤더 값 X-Apigee-fault-code protocol.http.BadFormData
X-Apigee-fault-source policy
X-Apigee-fault-policy extractvariables/EV-ExtractFormParams
- 이 예시에서 X-Apigee-fault-policy는
extractvariables/EV- ExtractFormParams,
입니다. 즉, 양식을 읽거나 추출하는 중에EV-ExtractFormParams
이(가) 실패했습니다. 매개변수입니다.
NGINX
<ph type="x-smartling-placeholder">NGINX 액세스 로그를 사용하여 오류를 진단하려면 다음 안내를 따르세요.
- Private Cloud 사용자인 경우 NGINX 액세스 로그를 사용하여
HTTP
500 Internal Server Error
에 대한 주요 정보를 결정합니다. NGINX 액세스 로그를 확인합니다.
<ph type="x-smartling-placeholder">/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
- 오류 코드와 함께
500
오류가 있는지 검색하여 확인합니다. 특정 시간 동안protocol.http.BadFormData
(문제가 발생한 경우 또는 여전히 실패하고 있는 요청이 있는지500
X-Apigee-fault-code에서
500
오류가 발견된 경우protocol.http.BadFormData
의 값과 일치하는 경우 X-Apigee-fault-source의 값을 결정하고 X-Apigee-fault-policy.NGINX 액세스 로그의 샘플 500 오류:
NGINX 액세스 로그의 위 샘플 항목에는 X-Apigee-fault-code 및 X-Apigee-fault-source:
헤더 값 X-Apigee-fault-code protocol.http.BadFormData
X-Apigee-fault-source policy
X-Apigee-fault-policy extractvariables/EV-ExtractFormParams
- X-Apigee-fault-code, X-Apigee-fault-source의 값은 다음과 같습니다.
각각
policy
protocol.http.BadFormData
입니다. X-Apigee-fault-policy는 비어 있지 않습니다. 이는 오류가 X-Apigee-fault-policy,에 표시된 특정 정책이 양식 데이터 (양식 매개변수)를 읽거나 추출하는데, 여기에는 사용이 허용되지 않습니다. - 이 예시에서 X-Apigee-fault-policy는
extractvariables/EV- ExtractFormParams,
입니다. 즉, 양식을 읽는 중에EV-ExtractFormParams
이(가) 실패했습니다. 매개변수입니다.
원인: 요청의 양식 매개변수에 사용할 수 없는 문자가 있습니다.
진단
- 설명된 대로 API 모니터링, Trace 도구 또는 NGINX 액세스 로그를 사용하여
500 Internal Server Error
의 결함 코드, 오류 소스, 결함 정책을 확인합니다. 자세한 내용은 일반적인 진단 단계를 참조하세요. - 결함 코드가
protocol.http.BadFormData
이면 결함 소스는 값이proxy
또는policy
이고 오류 정책이 비어 있으면, ,에 지정된 정책이 동시에 실패했음을 나타냅니다. 양식 데이터 읽기 또는 추출 (양식 매개변수) - 결함 정책에 표시된 정책을 검토하고 다음 사항을 확인합니다.
있습니다.
<ph type="x-smartling-placeholder">
- </ph>
- 출처: 정책이 다음에서 데이터를 읽거나 추출하는지 확인합니다. API에 액세스할 수 있습니다
- 양식 매개변수: 양식에서 판독 중인 특정 양식 매개변수를
정책
샘플 #1
샘플 #1: 양식 매개변수를 추출하는 ExtractVariables 정책:
<ExtractVariables name="EV-ExtractFormParms"> <DisplayName>EV-ExtractFormParams</DisplayName> <Source>request</Source> <FormParam name="username"> <Pattern ignoreCase="false">{username}</Pattern> </FormParam> <FormParam name="password"> <Pattern ignoreCase="false">{password}</Pattern> </FormParam> <VariablePrefix>forminfo</VariablePrefix> <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables> </ExtractVariables>
위의 ExtractVariables 정책에서 다음을 수행합니다.
출처:
request
<Source>
요소로 표시됩니다.양식 매개변수:
username
및password
이는 다음 요소 안에 있는
<Pattern>
요소로 나타냅니다.<FormParam>
요소
이는 양식 매개변수
username
또는 클라이언트에서 HTTP 요청의 일부로password
를 Apigee Edge에 사용할 수 없는 문자가 포함되어 있습니다.샘플 #2
샘플 #2: 양식 매개변수를 복사하는 AssignMessage 정책:
<AssignMessage continueOnError="false" enabled="true" name="AM-CopyFormParams"> <Copy source="request"> <FormParams> <FormParam name="username"/> <FormParam name="password"/> </FormParams> </Copy> <AssignTo createNew="true" transport="http" type="request"/> </AssignMessage>
위의 ExtractVariables 정책에서 다음을 수행합니다.
소스:
request
이는
source
속성으로 표시됩니다.<Copy>
요소양식 매개변수:
username
및password
이는
name
속성으로 표시됩니다.<FormParam>
요소
이는 양식 매개변수
username
,password
또는 클라이언트에서 Apigee Edge로 HTTP 요청의 일부로 전달되는 두 가지 모두 사용할 수 없는 문자입니다.
사용할 수 없는 문자가 있는지 확인합니다. 3단계에서 확인한 양식 매개변수에 사용된 문자 다음 방법 중 하나를 사용합니다.
추적 도구
Trace 도구를 사용하여 확인하려면 다음 단계를 따르세요.
- 다음에 설명된 대로 실패한 요청의 trace를 캡처한 경우 일반적인 진단 단계를 검토한 후 다음 중 하나를 선택하세요. 요청을 처리할 수 있습니다
- 어떤 문자가 포함된 양식 매개변수가
사용이 허용되지 않는 것은
3단계를 완료한 다음
<ph type="x-smartling-placeholder">
- </ph>
- Request Received from Client 단계로 이동합니다.
아래로 스크롤하여 단계 세부정보 섹션으로 이동한 후 콘텐츠 요청.
( 더 크게 보기)
- 위의 예에서 양식 매개변수
password
에 유의하세요. 퍼센트 기호 (%
)를 포함합니다. - 퍼센트 기호 (
%
)는 <ph type="x-smartling-placeholder"></ph> 퍼센트 인코딩, 특수문자를 포함하는 경우 이 문자를 그대로 사용할 수는 없습니다. 확인할 수 있습니다. - 따라서 Apigee Edge는
500 Internal Server Error
(오류 코드 포함)protocol.http.BadFormData
실제 요청
실제 요청을 사용하여 검증하려면 다음 안내를 따르세요.
- 대상 서버에 대한 실제 요청에 액세스할 수 없는 경우 문제 해결로 이동합니다.
- Apigee Edge에 대한 실제 요청에 액세스할 수 있는 경우 다음을 수행합니다.
다음 단계를 따르세요.
<ph type="x-smartling-placeholder">
- </ph>
- 양식 데이터 내용을 검토하고
퍼센트 기호 (
%
)와 같은 구문은 사용할 수 없습니다. 또는 퍼센트 기호 (%
) 뒤에 잘못된 코드가 표시됨 문자(16진수 문자)를 입력할 수도 있습니다.샘플 #1
샘플 요청 #1: 요청의 일부로 데이터 작성
curl -X GET "https://HOSTALIAS/myproxy -H "Content-Type: application/x-www-form-urlencoded" -d "client_id=123456abc123&client_secret=c23578%ZY"
이 예에서
client_secret
요소는 퍼센트 기호 (%
)와 그 뒤에 오는 잘못된 16진수 문자(ZY
)입니다.샘플 #2
샘플 요청 #2: 파일에서 양식 데이터 전달:
curl -X GET "https://HOSTALIAS/myproxy -H "Content-Type: application/x-www-form-urlencoded" -d @form_data.xml
form_data.xml의 콘텐츠:
xml=<user><username>abc1234@google.com</username><password>qwerty12345!@#$%</password></user>
이 예에서 요소
password
에 퍼센트 기호 (%
)가 포함되어 있습니다. 퍼센트 기호는 양식 데이터에 있는 그대로 전달됩니다.
- 양식 데이터 내용을 검토하고
퍼센트 기호 (
- 위의 두 예에서 HTTP 요청의 일부로 전송된 양식 데이터는 Apigee Edge에 사용할 수 없는 문자가 포함되어 있습니다.
- 따라서 Apigee Edge는
500 Internal Server Error
로 응답합니다. (오류 코드protocol.http.BadFormData
포함)
해상도
- 양식 데이터 또는 매개변수의 키와 값 모두에 특수문자가 있는지 확인합니다. 클라이언트에서 HTTP 요청의 일부로 전송하는 모든 URL은 항상 에 설명된 대로 인코딩됩니다. 양식 데이터 - application/x-www-form-urlencoded
- 위에서 설명한 예에서는 다음과 같이 문제를 해결할 수 있습니다.
샘플 #1
샘플 #1: 요청의 일부로 양식 데이터가 전달됩니다.
유효한 사용 특정 문자의 ASCII 코드와 일치하는 16진수 문자를 사용합니다. 예를 들어 달러 기호 (
$
)를 보내려면%24
을 사용합니다. 다음과 같습니다.curl -X GET "https://HOSTALIAS/myproxy -H "Content-Type: application/x-www-form-urlencoded" -d "client_id=123456abc123&client_secret=c23578%24"
샘플 #2
샘플 요청 #2: 파일에서 양식 데이터 전달:
curl -X GET "https://HOSTALIAS/myproxy -H "Content-Type: application/x-www-form-urlencoded" -d @form_data.xml
form_data.xml의 콘텐츠:
사용 <ph type="x-smartling-placeholder"></ph> 퍼센트 인코딩: 퍼센트 (
%
) 기호로 파일을 다음과 같이%25
가 있어야 합니다.xml=<user><username>abc1234@google.com</username><password>qwerty12345!!@#$%25</password></user>
사양
Apigee Edge는 다음 사양에 따라 양식 데이터가 전송될 것으로 예상합니다.
사양 |
---|
<ph type="x-smartling-placeholder"></ph> 양식 데이터 - application/x-www-form-urlencoded |
Apigee 지원팀의 도움이 더 필요한 경우 다음 수집하기 진단 정보를 제공합니다.
진단 정보 수집 필요
위의 안내를 따른 후에도 문제가 지속되면 다음을 수집합니다. Apigee Edge 지원팀에 문의하세요.
퍼블릭 클라우드 사용자인 경우 다음 정보를 입력합니다.
- 조직 이름
- 환경 이름
- API 프록시 이름
- 다음을 재현하는 데 사용되는
curl
명령어를 완료합니다.500 Internal Server Error
(오류 코드 포함) <ph type="x-smartling-placeholder">protocol.http.BadFormData
</ph> - API 요청에 대한 추적 파일
Private Cloud 사용자인 경우 다음 정보를 입력합니다.
- 실패한 요청에 대해 발견된 전체 오류 메시지
- 환경 이름
- API 프록시 번들
- API 요청에 대한 추적 파일
NGINX 액세스 로그
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
위치: ORG, ENV, PORT#가 다음으로 대체됩니다. 실제값입니다.
메시지 프로세서 시스템 로그
/opt/apigee/var/log/edge-message-processor/logs/system.log
참조
- <ph type="x-smartling-placeholder"></ph> 양식 콘텐츠 유형
- <ph type="x-smartling-placeholder"></ph> RFC3986, 섹션 2.1: 퍼센트 인코딩
- <ph type="x-smartling-placeholder"></ph> 퍼센트 인코딩
- <ph type="x-smartling-placeholder"></ph> 16진수 문자