Мы используем Amazon Product Advertising API для переоценки на их сайте. Для тех, кто не знает, это в основном позволяет вам запрашивать базу данных Amazon без необходимости выполнять трудоемкие операции, такие как просмотр веб-страниц. Это работает очень хорошо для нас, или работает. Теперь они расформировывают этот API для продавцов и переводят нас на новый API в их сервисе MWS.
Насколько я вижу, звонки немного отличаются. Два очевидных различия заключаются в том, что API PA использует HTTP и GET, тогда как MWS использует HTTPS и POST.
Я не совсем уверен, что примеры в документации Amazon верны, поскольку они дают примеры создания запроса URL-адреса с хэш-подписью. Именно так мы успешно делали это в PA-API, где использовался метод GET. Но можете ли вы сделать это для POST? Я не думаю, что это возможно, хотя я могу ошибаться, и примеры именно это и подразумевают.
В любом случае, создание подписанного URL-адреса не работает! Поэтому я решил рассмотреть варианты использования HTTPS POST более низкого уровня в Delphi.
Я искал здесь, и есть несколько разных примеров, но я не могу заставить ни один из них работать правильно. В некоторых примерах, кажется, используется INDY 10, к сожалению, мы застряли (по причинам совместимости) на INDY 9. Я также просмотрел функции типа оболочки WININET, но я просто не могу получить результат, кроме исключения или ошибок.
Поэтому я здесь и прошу помощи.
Как сделать правильно отформатированный вызов Amazon MWS с помощью Delphi? Я пробовал примеры с таких страниц, как:
Как сделать HTTPS-запрос POST в Delphi?
и т.д. и т.п. все, что смог найти!
Но я получаю ошибки, такие как «Неверный запрос» (исключение).
Я попытался использовать Fiddler (как было предложено в другом месте), чтобы посмотреть, что происходит, но пока не могу понять это (хотя я могу составить в нем вызов, который работает!)
Поэтому я ищу некоторые указатели или какое-то направление по этому поводу. Я действительно не хочу обновлять INDY или добавлять новые библиотеки. Я просто предпочел бы оставить все как есть и использовать то, что у меня есть. Мы используем D2007.
Чтобы дать представление о том, что требуется, мне нужно сделать такой вызов (самый простой — GetServiceStatus
):
POST /Products/2011-10-01?AWSAccessKeyId=<ACCESSKEY>
&Action=GetServiceStatus
&SellerId=<SELLERID>
&SignatureVersion=2
&Timestamp=2012-02-14T13%3A26%3A42Z
&Version=2011-10-01
&Signature=dtAvv595blmv%2FnV0h2Yr5bCGzKYXid0hkOuCmZOb3bc%3D
&SignatureMethod=HmacSHA256
К этой конечной точке:
https://mws.amazonservices.co.uk/Products/2011-10-01
Я думаю, что моя проблема во всех примерах, которые я пробовал, я не знаю, как правильно настроить вызов, и, вероятно, поэтому я получаю ошибки Bad Request.
Таким образом, хорошее простое решение будет высоко оценено!
Ссылки на документацию и наблюдения:
Это руководство разработчика для API:
Это конкретная часть API, которую мы будем использовать (которая заменяет текущий API рекламы продукта):
Самой простой функцией здесь является функция GetServiceStatus. Он не принимает никаких параметров. Но его по-прежнему необходимо аутентифицировать и «подписать» с использованием учетных данных Amazon (идентификатор продавца, ключ доступа к MWS и секретный ключ (для создания подписи). Мне кажется, что если я смогу заставить работать самые простые функции, то Остальное последует.Но проблема аутентификации - это то, что делает поиск решения таким трудным.Тестовой учетной записи нет.И также временная метка (и, следовательно, подпись для звонка) истекает и несколько минут.
Существует также «руководство по миграции»:
Но этот документ содержит некоторые ошибки. Например, конечные точки неверны.
Мой последний код, включая ssl, менеджер файлов cookie и т. д.:
var
LHTTP : TIdHTTP;
IdSSLIOHandlerSocket : TIdSSLIOHandlerSocket;
IdCookieManager : TIdCookieManager;
LParams : TStringList;
LResponse : string;
begin
IdCookieManager:=TIdCookieManager.Create(self);
IdSSLIOHandlerSocket:=TIdSSLIOHandlerSocket.Create(self);
with IdSSLIOHandlerSocket do begin
SSLOptions.Method := sslvSSLv3;
end;
LHTTP := TIdHTTP.Create(Self);
with LHTTP do begin
CookieManager:=IdCookieManager;
AllowCookies:=true;
IOHandler:=IdSSLIOHandlerSocket;
Request.ContentType:='text/xml';
Port:=443;
HandleRedirects:=true;
Host:='mws.amazonservices.co.uk';
ProtocolVersion:=pv1_1
end;
LParams := TStringList.Create;
try
LParams.Add('AWSAccessKeyId=<ACCESSKEY>');
LParams.Add('Action=GetServiceStatus');
LParams.Add('SellerId=<SELLERID>)');
LParams.Add('SignatureVersion=2');
LParams.Add('Timestamp=2012-02-15T13%3A00%3A07Z');
LParams.Add('Version=2011-10-01');
LParams.Add('Signature=viPlDAbzEBwlTAwq4hNaZi%2Fa1Klf7qIXIP%2BKUsOcJTI%3D');
LParams.Add('SignatureMethod=HmacSHA256');
LResponse:=LHTTP.Post('https://mws.amazonservices.co.uk/Products/2011-10-01?', LParams);
ShowMessage( LResponse );
except
on E: Exception do
ShowMessage('ouch! ' + E.Message );
end;
LHTTP.Free;
IdSSLIOHandlerSocket.Free;
IdCookieManager.Free;
end;
Это основано на том, что Amazon ожидает получить в соответствии со своим блокнотом. Пользовательский агент в конце является необязательным, необязательным и не является частью процесса подписания:
POST /Products/2011-10-01?AWSAccessKeyId=<ACCESSID>
&Action=GetServiceStatus
&SellerId=<SELLERID>
&SignatureVersion=2
&Timestamp=2012-02-15T13%3A00%3A07Z
&Version=2011-10-01
&Signature=viPlDAbzEBwlTAwq4hNaZi%2Fa1Klf7qIXIP%2BKUsOcJTI%3D
&SignatureMethod=HmacSHA256 HTTP/1.1
Host: mws.amazonservices.co.uk
x-amazon-user-agent: AmazonJavascriptScratchpad/1.0 (Language=Javascript)
Content-Type: text/xml
Я попытался получить информацию от Fiddler, но он не показывает никакого трафика от программного обеспечения, но он должен общаться с Amazon, чтобы получить ошибку «400 неверный запрос». Странный.
edit
под списком тегов для вашего вопроса. Вот как работает этот сайт: это не форум для дискуссий, это сайт вопросов и ответов. - person Cosmin Prund   schedule 15.02.2012