当前位置: 首页 > 知识库问答 >
问题:

无法在salesforce中的apex web服务标注中设置标头

罗俭
2023-03-14

我目前正在尝试调用Salesforce中的亚马逊产品零售Web服务。

正如我在Salesforce中从WSDL生成Apex代码时得到WSDL解析错误中提到的

我最初无法生成apex存根类,但我遵循了@Ballinger建议的方法,创建了apex类。我编写了一个apex类来使用该存根并设置请求参数。我写的类如下

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>

正如你所看到的,我是Salesforce Apex的新手。我按照步骤

http://www.salesforce.com/us/developer/docs/apexcode/index_left.htm#starttopic=content/apex_web_services_wsdl2apex.htm#http_header_support

若要设置标头,请执行以下操作。

谢谢:)

共有1个答案

苍宝
2023-03-14

我认为你使用了错误的函数:)(这个问题确实让人困惑)。

SOAP(或者通常是HTTP)通信包括发送报头和实际消息(如果您愿意,可以使用有效负载)。标题是短文本,消息通常是一个巨大的XML。

您的代码正在设置HTTP头(在web通信中用于身份验证、提供有关浏览器的信息、首选语言、设置Cookie、返回状态代码(如404 page not Found...)请不要被“for dummies”冒犯,但我意识到维基百科的文章有点太多了,这可能更简单:http://net.tutsplus.com/tutorials/other/http-headers-for-dummies/

我怀疑Amazon的webservice想要的只是 ... 标记中的一些字段?只需检查生成的apex代码中是否存在名为“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。但一般来说,我相信您希望将数据放在XML中,而不是http头中。

非常有趣的是,我已经从http://aws.amazon.com/code/product-advertising-api/2478下载了Java示例,如果我没有读错的话,它们是在URL(endpoint)中传递签名,而不是在XML中传递签名。可能是因为它是一个REST GET方法(如果您可以访问该API,它可以为您节省大量的工作,SOAP是笨重的)。

 类似资料:
  • 如何在nodejs中发送文件,我正在创建一个页面应用程序,所以我只想abcd.html页面首次按要求交付,这是我的代码 app.js 对页面的响应 发送后,它总是给出无法设置的标题,下面是控制台输出 错误:SendStream禁止。SendStream出错(/home/pitu/CODING/NODE-PROJECTS/chichat/NODE\u modules/express/NODE\u m

  • 我正在使用restlet框架制作REST web服务。我正在使用组织。restlet 2.3.1 jar 我必须自定义错误响应头。根据具体问题,我必须在响应标题中显示响应状态代码和状态原因。为此,我创建了一个扩展StatusService并重写toStatus方法的类。我检查可丢弃项并相应地设置状态。请参阅下面的示例代码。 因此,无论何时从restlet代码中抛出异常,都会在此处捕获并返回错误响应

  • 我在Apache CXF中实现了web服务。有没有办法使用AddressingProperties将SOAP头设置为请求(服务器端)? 这对我有用: 但我想使用org。阿帕奇。cxf。ws。寻址。AddressingProperties-类似这样的内容: 我如何将其传递给请求?我无法通过MessageContext进行设置

  • 我正在尝试创建一个简单的没有任何数据库的NodeJS和Express的REST API。我已经将所有数据存储在JSON文件中。数据是对象数组的形式。 我有像fund-name/: portId这样的路径。 所以我这样做: 当我点击网址 时,我收到以下错误: 错误[ERR_HTTP_HEADERS_SENT]:在ServerResponse.header(/home/username/Desktop

  • 我正在尝试在驼峰JMS(ActiveMQ)使用者上设置预回迁策略。根据Camel文件http://camel.apache.org/activemq.html#ActiveMQ-使用ActiveMQDestinationOptions,我应该能够通过添加

  • 我正在使用ASP.NET WebApi创建一个RESTful API。我正在我的一个控制器中创建一个PUT方法,代码如下所示: 当我通过AJAX使用浏览器将其放到该位置时,它给出了以下例外情况: 标头名称使用不当。确保请求标头与HttpRequestMessage一起使用,响应标头与HttpReponseMessage一起使用,内容标头与HttpContent对象一起使用。 但是不是一个完全有效的