Я пытаюсь получить рейтинг отзыва товаров через API просмотра eBay.Вот мой код для этой функции:
sHeaders := TStringList.Create;
sHeaders.Add('X-EBAY-C-ENDUSERCTX=' + '"affiliateCampaignId=' + '533xxxxxxx"');
objIdHTTP.Request.CustomHeaders.AddStdValues(sHeaders);
sResponse := objIdHTTP.Get('https://api.sandbox.ebay.com/buy/browse/v1/item/v1|123456789|0');
Но я получаю Socket Error 10054 при тестировании этого кода.
Возможно, что-то не так с частью заголовка клиента, но я могуНе могу понять, как заставить это работать.
Может ли кто-нибудь помочь мне с ошибками?
Вот ссылка на документ API eBay, на который я ссылаюсь:
Обзор API |Используйте заголовки запроса
ОБНОВЛЕНИЕ : вот мой обновленный код:
objIdHTTP.Request.CustomHeaders.AddValue('X-EBAY-C-ENDUSERCTX', 'affiliateCampaignId=' + '533xxxxxxx');
sResponse := objIdHTTP.Get('https://api.sandbox.ebay.com/buy/browse/v1/item/v1|123456789|0');
У него все та же ошибка.
Я проверялURL-ссылка в Почтальоне, и я получил сообщение об ошибке, как показано ниже:
{
"errors": [
{
"errorId": 1002,
"domain": "OAuth",
"category": "REQUEST",
"message": "Missing access token",
"longMessage": "Access token is missing in the Authorization HTTP request header."
}
]
}
Существует много идентификаторов, таких как AppID, DevID, CerID, OAuthToken (9583 символа), Token for Store (3343 символа),EPN Campaign (уже включена в этот заголовок URL).
Я пытался с X-EBAY-API-IAF-TOKEN: OAuthToken
, но он ответил тем же сообщением об ошибке.
UPDATE :
Спасибо за помощь в StackOverflow, в частности, Реми Лебо.Наконец, я получил рабочие коды, как показано ниже:
with objHTTP.Request.CustomHeaders do begin
Clear;
FoldLines := False;
Values['Content-Type'] := 'application/x-www-form-urlencoded';
Values['Authorization'] := 'Basic ' + 'myAuthCode';
end;
xRequestBody := TStringStream.Create('{"Authorization":"Basic ' + 'myAuthCode' + '"' + ','
+ ' "Content-Type:' + 'application/x-www-form-urlencoded' + '"}',
TEncoding.UTF8);
sResponse := objHTTP.Post(sURL, xRequestBody);
Я до сих пор не знаю, почему indy HTTP нужно дважды назначить ContentType и Authorization, но эти коды хорошо работают для меня сейчас.
ОБНОВЛЕНИЕ : Обратитесь к совету Реми Лебо, ContentType назначен непосредственно idHTTP.Request и коды обновляются снова, как показано ниже:
with objHTTP.Request do begin
Clear;
ContentType := 'application/x-www-form-urlencoded';
CustomHeaders.FoldLines := False;
CustomHeaders.Values['Authorization'] := 'Basic ' + myAuthCode;
end;
xRequestBody := TStringStream.Create('{"Authorization":"Basic ' + myAuthCode + '"}', TEncoding.UTF8);
sResponse := objHTTP.Post(sURL, xRequestBody);
Давайте вернемся к моей начальной точке.Теперь я начинаю бороться с GET, чтобы иметь Авторизацию, код изменен с первой части на те (код обновляется снова, чтобы захватить http-запрос):
objHTTP.Intercept := xIdLogDebug;
with objHTTP.Request.CustomHeaders do begin
Clear;
FoldLines := False;
Values['X-EBAY-C-ENDUSERCTX'] := 'affiliateCampaignId=' + '533xxxxxxx';
Values['Authorization'] := 'Bearer ' + myToken;
Values['Postman-Token'] := '65546b71-aef8-422e-916d-93b75ddd9de2,a0687ba7-e142-4849-8288-a8f89b66f253';
Accept := '*/*';
UserAgent := 'PostmanRuntime/7.13.0';
CacheControl := 'no-cache';
AcceptEncoding := 'gzip, deflate';
Connection := 'keep-alive';
end;
with objHTTP do begin
AllowCookies := True;
CookieManager := objCookie;
end;
Result := objHTTP.Get('https://api.sandbox.ebay.com/buy/browse/v1/item/v1|123456789|0');
Он все еще получает Socket Error 10054. Я тестировалэтот URL в Почтальоне, и он отлично работает.Единственное, на что я могу указать, это то, что в Postman есть один параметр TYPE для авторизации, и он выбран как «OAuth 2.0».
Итак, как назначить авторизацию для Indy HTTP для GET?Может быть что-то вроде RequestBody в POST.
UPDATE :
Вот полученные данные при вызове POST через IndyHTTP:
HTTP/1.1 200 OK
Content-Length: 1905
Date: Sat, 01 Jun 2019 11:09:08 GMT
RlogId: t6ldssk%28ciudbq%60anng%7Fu2h%3F%3Cwk%7Difvqn*14%3F0512%29pqtfwpu%29pdhcaj%7E%29fgg%7E%606%28dlh-16b12ba9d25-0x4fd7e
Set-Cookie: ebay=%5Esbf%3D%23%5E;Domain=.ebay.com;Path=/
Set-Cookie: dp1=bu1p/QEBfX0BAX19AQA**5ed39054^;Domain=.ebay.com;Expires=Mon, 31-May-2021 11:09:08 GMT;Path=/
X-Content-Type-Options: nosniff
X-EBAY-C-VERSION: 1.0.0
X-EBAY-REQUEST-ID: 16b12ba9d1f.a0962ac.25e7e.ff9d75b3!/identity/v1/oauth2/!10.9.98.172!esbnewesbngcos[]!token.clientcredentials!10.9.107.144!r1oauth-envadvcdhidzs5k[IdentityCDSClient[!ClientDetailResourceV1.getClientDetail!10.199.16.86!r1oauthclnt-envjiwv5gtvevlbi[]]]
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
Content-Type: application/json
Connection: keep-alive
{"access_token":"v^1.1#i^............","expires_in":7200,"token_type":"Application Access Token"}
Это захваченозапрос по вызову GET (запуск после POST) из IndyHTTP (преобразуется из TIdBytes в строку):
GET /buy/browse/v1/item/v1|123456789|0 HTTP/1.1
Content-Type: application/json
X-EBAY-C-ENDUSERCTX: affiliateCampaignId=533xxxxxxx
Authorization: Bearer v^1.1#i^............
Postman-Token: 65546b71-aef8-422e-916d-93b75ddd9de2,a0687ba7-e142-4849-8288-a8f89b66f253
Host: api.sandbox.ebay.com
Accept: */*
Accept-Encoding: gzip, deflate, identity
User-Agent: PostmanRuntime/7.13.0
Cookie: dp1=bu1p/QEBfX0BAX19AQA**5ed3395b^; ebay=%5Esbf%3D%23%5E
И это код, скопированный из Почтальона:
GET /buy/browse/v1/item/v1|123456789|0 HTTP/1.1
Host: api.sandbox.ebay.com
X-EBAY-C-ENDUSERCTX: affiliateCampaignId=533xxxxxxx
Authorization: Bearer v^1.1#i^............
User-Agent: PostmanRuntime/7.13.0
Accept: */*
Cache-Control: no-cache
Postman-Token: 65546b71-aef8-422e-916d-93b75ddd9de2,a0687ba7-e142-4849-8288-a8f89b66f253
Host: api.sandbox.ebay.com
cookie: ebay=%5Esbf%3D%23%5E; dp1=bu1p/QEBfX0BAX19AQA**5ed2398a^bl/AU60b36d0a^; s=; nonsession=CgADKACBmVweKZWYwZThjOGQxNmEwYWMxZTQ2MDNlNGJhZmZkYjQzNTT+86sJ
accept-encoding: gzip, deflate
Connection: keep-alive
cache-control: no-cache
Я борюсь, какой параметрделает IndyHTTP получил ошибку # 10054 с сервера.
Спасибо.