eBay Trading API - структура вызовов в Delphi - PullRequest
0 голосов
/ 05 ноября 2018

Я пытаюсь вызвать eBay API через Delphi. После долгого поиска в Google и StackOverflow, теперь я могу заставить работать "GeteBayTime" (API покупок) и "FindItemsByKeywords" (API поиска).

Когда я начал тестировать с Trading API, я понятия не имел, где и как вставить информацию об аккаунте продавца (идентификатор пользователя и пароль). Моя первая программа для торговли API показана ниже и запускается с помощью вызова API «GetSellingManagerSoldListings».

Может ли кто-нибудь показать мне ключ к тому, чтобы заставить работать API торговли? А если что-то еще нужно добавить в HTTP.header или Paramters?

Спасибо.

procedure TForm1.btnEBayGetSoldListClick(Sender: TObject);
var
  sURL, sResponse, sEndpoint: String;
  jResult: TJSONObject;
  sCallName, sSiteID, sVersion: String;
  k: Integer;
  sParameters: String;
  sHeaders: TStringList;
  sRequestBody: TStringStream;
begin
  // Trading API
  sEndpoint := 'https://api.sandbox.ebay.com/ws/api.dll';

  sCallName := 'GetSellingManagerSoldListingsRequest';
  sSiteID := '15';
  sVersion := '967';
  sAppID := 'myAppID';
  sDevID := 'myDevID';
  sToken : 'myToken';    // OAuth Token?

  sURL := sEndpoint
       + '?callname=' + sCallName
       + '&siteid=' + '15';

  sHeaders := TStringList.Create;
  with sHeaders do begin
    Add('X-EBAY-API-COMPATIBILITY-LEVEL' + '=' + sVersion);
    Add('X-EBAY-API-DEV-NAME' + '=' + sDevID);
    Add('X-EBAY-API-APP-NAME' + '=' + sAppID);
    Add('X-EBAY-API-CERT-NAME' + '=' + sCertID);
    Add('X-EBAY-API-CALL-NAME' + '=' + sCallName);
    Add('X-EBAY-API-SITEID' + '=' + sSiteID);
  end;

  objHTTP.Request.ContentType := 'text/xml';

  with objHTTP.Request.CustomHeaders do begin
    Clear;
    AddStdValues(sHeaders);
  end;
  sHeaders.Free;

  sParameters := '<GetSellingManagerSoldListingsRequest xmlns="urn:ebay:apis:eBLBaseComponents">'
               + '  <RequesterCredentials>'
               + '    <eBayAuthToken>' + sToken + '</eBayAuthToken>'
               + '   <Filter>' + 'PaidNotShipped' + '</Filter>'
               + '  </RequesterCredentials>'
               + '</GetItemTransactionsRequest>';
  sRequestBody := TStringStream.Create(sParameters, TEncoding.UTF8);

  try
    sResponse := objHTTP.Post(sURL, sRequestBody);
    memHTML.Lines.Add(sResponse);
    memHTML.Lines.Add('');
  except
    sResponse := objHTTP.ResponseText;
    memHTML.Lines.Add(sResponse);
    memHTML.Lines.Add('');
  end;
end;

1 Ответ

0 голосов
/ 05 ноября 2018

Вот, пожалуйста. Завершите рабочий конверт GetSellingManagerSoldListingsRequest SOAP:

<?xml version="1.0"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
 xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<SOAP-ENV:Header>
    <NS1:RequesterCredentials xmlns:NS1="urn:ebay:apis:eBLBaseComponents">
        <eBayAuthToken xmlns="urn:ebay:apis:eBLBaseComponents">EbayToken</eBayAuthToken>
        <NS1:Credentials>
            <AppId xmlns="urn:ebay:apis:eBLBaseComponents">xxx</AppId>
            <DevId xmlns="urn:ebay:apis:eBLBaseComponents">xxx</DevId>
            <AuthCert xmlns="urn:ebay:apis:eBLBaseComponents">xxx</AuthCert>
        </NS1:Credentials>
    </NS1:RequesterCredentials>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
    <GetSellingManagerSoldListingsRequest xmlns="urn:ebay:apis:eBLBaseComponents">
        <DetailLevel>ReturnAll</DetailLevel>
        <ErrorLanguage>en_GB</ErrorLanguage>
        <Version>945</Version>
        <Search>
            <SearchType>SaleRecordID</SearchType>
            <SearchValue>xxx</SearchValue>
        </Search>
        <Archived>false</Archived>
        <SaleDateRange>
            <TimeFrom>2018-08-12T17:59:32.939+02:00</TimeFrom>
            <TimeTo>2018-11-05T14:59:32.940+01:00</TimeTo>
        </SaleDateRange>
    </GetSellingManagerSoldListingsRequest>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Вы можете опустить теги "search", чтобы получить полный список. Большинство запросов API для торговли работают именно так.

Самый простой способ сделать это в Delphi:

Просто поместите THTTPReqResp на вкладке WebServices в форме вместо TidHTTP, установите url (THTTPReqResp1.URL) и запустите с THTTPReqResp1.Execute (const DataMsg: String; Resp: TStream); где DataMsg предоставляется конверт SOAP, а ответ сохраняется в TStream (например, TStringStream). Вам также может понадобиться установить InvokeOptions -> soIgnoreInvalidCerts в некоторых случаях.

Хотя можно «собрать» запрос так, как вы это сделали, я бы рекомендовал использовать мастер WSDL, импортировать EBAY WSDL использовать WSDL Pruner Tool , чтобы вырезать менее важные функции (чтобы избежать «E2491 Превышен максимальный счет VIRDEF; проверка на рекурсию») и продолжить работу с автоматически сгенерированным блоком.

...