갱킹을 시작하세요.
서버:
Spring3.0.5 CXF2.4, JDK1.6
자동으로 생성된 wsdl 파일이 "되어야 합니다"<서버는 우리 것이 아닙니다>
클라이언트:
PHP5.1.3
첫 번째 질문:
SOAP-ERROR: 인코딩: 객체에 'id' 속성이 없습니다
근데 API 문서에는 ID가 필요하지 않다고 되어 있으니 wsdl 파일의 내용을 확인하세요
스키마 문서를 확인하고 다음 내용을 찾으세요.
스키마를 통해 maxOccurs 및 minOccurs 속성을 사용하여 요소가 나타날 수 있는 횟수를 정의할 수 있습니다. maxOccurs는 요소의 최대 발생 횟수를 정의하고, minOccurs는 요소의 최소 발생 횟수를 정의합니다. maxOccurs와 minOccurs의 기본값은 모두 1입니다! (그럼 서버측 문제인가요? 그럼 그냥 값만 썼더니 통과됐네요...)
추신: 중간에 작은 링크가 있습니다. PHP 소스 코드를 살펴봤습니다. . .
SOAP의 php_encoding.c에 있는 model_to_xml_object 함수
static int model_to_xml_object(xmlNodePtr node, sdlContentModelPtr model, zval *object, int style, int strict TSRMLS_DC)
//작은 코드
} else if (모델->min_occurs == 0) {
2를 반환
} 다른 {
if (엄격) {
Soap_error1(E_ERROR, "인코딩: 객체에 '%s' 속성이 없습니다.", model->u.element->name);//분명히
}
0을 반환
}
두 번째 질문:
이 문제를 해결하는 데 오랜 시간이 걸렸기 때문에 답답합니다
데이터가 반환된 후 패킷을 캡쳐했는데(데이터를 직접 표시하는 방법이 있는 것 같습니다) 반환된 데이터가 다음 형식과 유사하다는 것을 확인했습니다.
HTTP/1.1 200 OK
서버: Apache-Coyote/1.1
콘텐츠 유형: multipart/관련; 경계 = "uuid:0c37c356-41de-4361-9835-ab8dc023dcac"; start="
콘텐츠 길이: 790
날짜: 2012년 12월 4일 화요일 07:57:45 GMT
--uuid:0c37c356-41de-4361-9835-ab8dc023dcac
콘텐츠 유형: 애플리케이션/xop xml; type="text/xml";
콘텐츠 전송 인코딩: 바이너리
콘텐츠 ID: 2003
분명히 XML은 아닙니다. . 그래서 PHP 상사가 오류를 보고했습니다
상대방에게 물어보면 대답은 이렇습니다.
CXF는 다음과 같은 업로드 속성을 설정합니다. 핵심은 PHP SOAP 확장이 이를 기본적으로 지원하지 않는다는 것입니다
baidu, google은 WSO2 WSF FOR PHP 확장을 통해 구현할 수 있습니다. 신경 쓰지 말고 계속 찾아보세요. . .
공식문서 소개 보러가기
http://cn2.php.net/soap
문제 해결에 도움이 되는 답변이 있었습니다. 최종 해결 방법은 다음과 같습니다.
/**
* SoapClient 클래스를 상속하고 __doRequest 메서드를 재정의합니다.
* @author zhjx922
*/
클래스 ZSoapClient는 SoapClient를 확장합니다
{
공개 함수 __doRequest($request, $location, $action, $version, $one_way = 0)
{
$response = parent::__doRequest($request, $location, $action, $version, $one_way)
//실제 상황에 따라 처리합니다. . . , 로 변경하세요.
$start=strpos($response,'<비누')
$end=strrpos($response,'>')
$response_string=substr($response,$start,$end-$start 1)
반환($response_string)
}
}