2012-11-28 3 views
1

현재 Salesforce에서 Amazon Product Retail Web Service에 전화를 걸려고합니다. 제가 Getting WSDL parse error while generating Apex code from WSDL in Salesforcesalesforce에서 apex 웹 서비스 콜 아웃에 헤더를 설정할 수 없습니다.

에서 언급했듯이

난 정점 Stub 클래스를 생성 할 수없는 초기했지만, I는 @Ballinger 제안한 방법을 따라 정점 클래스를 만들었다. 그 스텁을 사용하고 요청 매개 변수를 설정하기 위해 apex 클래스를 작성했습니다. 내가, 내가 XML 요청 메시지를받지 못했습니다 스텁 HTTP 헤더를 추가 한 경우에도

public class AmazonProductStubNew 
{ 
public static void getResults() 
{ 
     System.Debug(' getResults start '); 
     AmazonWS.AWSECommerceServicePortUS stub = new AmazonWS.AWSECommerceServicePortUS(); 

     stub.inputHttpHeaders_x = new Map<String,String>(); 
     stub.inputHttpHeaders_x.put('AWSAccessKeyId','MyAmazonAWSAccessKeyId'); 
     stub.inputHttpHeaders_x.put('Timestamp','2012-11-28T12:11:30Z'); 
     stub.inputHttpHeaders_x.put('Signature','Encrypted Secret Code'); 
     String MarketplaceDomain = ''; 
     String AWSAccessKeyId = 'MyAmazonAWSAccessKeyId'; 
     String AssociateTag = ''; 
     String XMLEscaping = ''; 
     String Validate = ''; 
     AmazonWS.ItemSearchRequest Shared = new AmazonWS.ItemSearchRequest(); 
     Shared.SearchIndex = 'DVD'; 
     AmazonWS.ItemSearchRequest[] Request = new AmazonWS.ItemSearchRequest[1]; 
     Request[0] = new AmazonWS.ItemSearchRequest(); 
     Request[0].Title = 'Inception'; 
     AmazonWS.ItemSearchResponse_element response = stub.ItemSearch(MarketplaceDomain,AWSAccessKeyId,AssociateTag,XMLEscaping,Validate,Shared,Request); 
     AmazonWS.Items_element[] localItems = response.Items; 
     System.Debug(localItems[0].TotalResults); 
} 
} 

을 다음과 같이 내가 쓴 클래스입니다

<?xml version="1.0" encoding="UTF-8"?> 
<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<env:Header /> 
<env:Body> 
<ItemSearch xmlns="http://webservices.amazon.com/AWSECommerceService/2011-08-01"> 
<MarketplaceDomain> 
</MarketplaceDomain> 
<AWSAccessKeyId>MyAWSAccessKeyId</AWSAccessKeyId> 
<AssociateTag></AssociateTag> 
<XMLEscaping></XMLEscaping> 
<Validate></Validate> 
<Shared><SearchIndex>DVD</SearchIndex></Shared> 
<Request><Title>Inception</Title> 
</Request></ItemSearch> 
</env:Body></env:Envelope> 

헤더 때문에 다음과 같이 XML 요청입니다 SOAP 요청에 없습니다. Amazon Server에서 Signature를 요청하는 SOAP 오류가 있습니다.

보시다시피 Salesforce Apex를 처음 사용했습니다. 나는 헤더를 설정하는

http://www.salesforce.com/us/developer/docs/apexcode/index_Left.htm#StartTopic=Content/apex_web_services_wsdl2apex.htm#http_header_support

의 단계를 따라 갔다.

헤더가 추가되지 않는 이유에 대한 아이디어가 있으십니까?

P.S 수동으로 헤더를 추가하고 SOAP UI에서 시도했지만 적절한 응답을 얻었습니다.

감사합니다 :)

+0

질문을 명확히 할 수 있습니까, 제목은 HTTP 헤더에 대해 이야기하지만 질문은 SOAP 메시지 헤더에 관한 것 같습니다. – superfell

+0

ur 답장을 보내 주셔서 감사합니다 :) AWSAccessKeyId, Timestamp, Signature 요청 메시지를 생성하는 동안 SOAP UI에서 요청 처리를 위해 세 가지 모두가 있어야합니다.이 메시지는 에 지정되었으며 정상적으로 작동했습니다. 그러나 apex 클래스를 통해 추가 할 때 빈으로 표시된대로 추가되지 않습니다. . 내 머리글 설정이 정점 코드에서 잘못 되었습니까? 그게 내 질문. Apex 튜토리얼에 따라 스텁에는 inputHttpHeaders_x 맵이 있습니다. 이젠 분명해? – Satty

+0

질문 제목을 수정할 수 있습니까? – superfell

답변

1

난 당신이 잘못된 기능 : (질문은 참으로 혼란)를 사용하는 것 같아요.

SOAP (또는 일반적으로 HTTP) 통신은 헤더와 실제 메시지 (원하는 경우 페이로드)로 구성됩니다. 헤더는 짧은 텍스트 형식이며 메시지는 종종 거대한 XML입니다.

귀하의 코드는 HTTP headers입니다 (인증을 위해 웹 통신, 귀하의 브라우저에 대한 정보 제공, 기본 언어 설정, 쿠키 설정, 404 페이지와 같은 상태 코드 반환) ...) 불쾌 해하지 마십시오. "for dummies"하지만 위키 피 디아의 기사가 너무 많아서 더 간단 할 수도 있습니다. http://net.tutsplus.com/tutorials/other/http-headers-for-dummies/

아마존의 웹 서비스가 원하는 것은 <env:Header>...</env:Header> 태그 안의 일부 필드입니까? "Header"라는 하위 클래스의 존재에 대해 생성 된 꼭대기 코드를 확인하십시오 ("Signature"와 같은 변수 이름을 검색 할 수도 있습니다.) 이것은 전체적인 추측이 될 것입니다. 그러나 다음과 같이 작성해야합니다. 이제

AmazonWS.AWSECommerceServicePortUS stub = new AmazonWS.AWSECommerceServicePortUS(); 
AmazonWS.Header h = new AmazonWS.Header(); 
h.AWSAccessKeyId = 'MyAmazonAWSAccessKeyId'; 
h.Timestamp = '2012-11-28T12:11:30Z'; 
h.Signature = 'Encrypted Secret Code'; 
stub.Header = h; // plug it into the request 

// create and plug other required tags 
AmazonWS.ItemSearchRequest Shared = new AmazonWS.ItemSearchRequest(); 
Shared.SearchIndex = 'DVD'; 
AmazonWS.ItemSearchRequest[] Request = new AmazonWS.ItemSearchRequest[1]; 
Request[0] = new AmazonWS.ItemSearchRequest(); 
Request[0].Title = 'Inception'; 
// ... 

, 더 당신이 여전히 HTTP 헤더를 사용해야 할 수도 있습니다 혼동하기 위해, SOAPAction라는 특별한 일이있다. 그러나 일반적으로 HTTP가 아닌, XML에서 데이터를 배치 한 후 당신이있어 생각 말하기 내가 제대로 읽을 경우 헤더. 충분히 재미


, 나는 t http://aws.amazon.com/code/Product-Advertising-API/2478에서 자바 예제를 다운로드 한 XML에서가 아니라 URL (끝점)에 서명을 전달합니다. 아마도 그것은 REST GET 메서드 일 것입니다 (API에 액세스 할 수 있다면 많은 머리카락을 저장할 수 있고 SOAP은 clunky입니다).

+0

네, HTTP 헤더와 SOAP 헤더와 완전히 혼동을 느낍니다. (내 잘못입니다. 스텁 안의 Signature 요소를 찾는 두 번째 요점에 대해서는 행운이 없습니다. (이 링크를 따라 가고 있습니다.) http://boards.developerforce.com/t5/Apex-Code-Development/WSDL2Apex-adding-my-own-SOAP-Headers-to-the-apex-class/td-p/142237 비누 머리글을 직접 추가하려면 Amazon WSDL에서. 작업 결과를 게시합니다. :) 도움이되는 눈썹 크림에 감사드립니다.이 사진이 두 번째로 도움이되었습니다. D – Satty

관련 문제