Мне нужно перевести java код на delphi
Имейте следующий java-код:
// Set your API key: remember to change this to your live API key in production String apiKeyUserName = "your api username"; String apiKeyPassword = "your api password"; // Set the query params DefaultHttpClient httpclient = new DefaultHttpClient(); List<NameValuePair> params = new ArrayList<NameValuePair>(); params.add(new BasicNameValuePair("fromPostcode", "2000")); params.add(new BasicNameValuePair("toPostcode", "3000")); params.add(new BasicNameValuePair("networkId", "01")); params.add(new BasicNameValuePair("lodgementDate", "2013-08-01")); String query = URLEncodedUtils.format(params, "UTF-8"); String urlPrefix = "api.auspost.com.au"; String validateURL = "https://" + urlPrefix + "/DeliveryDates.xml?"; HttpGet httpGet = new HttpGet(validateURL + query); httpGet.addHeader("Cookie", "OBBasicAuth=fromDialog"); httpGet.addHeader(BasicScheme.authenticate( new UsernamePasswordCredentials(apiKeyUserName, apiKeyPassword), "US-ASCII",false)); HttpResponse response = httpclient.execute(httpGet);
Что я уже пробовал:
Хочу перевести это на язык Delphi. Для запроса я использовал TIdHttp как показано ниже:
procedure RequestDeliveryDate; var IdHTTP: TIdHTTP; LHandler: TIdSSLIOHandlerSocketOpenSSL; lResponse: String; requestURL: String; begin IdHTTP := TIdHTTP.Create(); IdHTTP.Request.BasicAuthentication := True; IdHTTP.Request.Username := 'your api username'; IdHTTP.Request.Password := 'your api password'; IdHTTP.Request.CharSet := 'utf-8'; LHandler := TIdSSLIOHandlerSocketOpenSSL.Create(); IdHTTP.IOHandler := LHandler; requestURL := 'https://api.auspost.com.au/DeliveryDates.xml?fromPostcode=2000' + '&toPostcode=3000' + '&networkId=01' + '&lodgementDate=2018-02-23' + '&numberOfDates=01'; screen.Cursor := crHourGlass; try lResponse := IdHTTP.Get(requestURL); screen.Cursor := crDefault; except on E: Exception do begin screen.Cursor := crDefault; ShowMessage(E.Message); end; end; IdHTTP.Free; end;
Давайте предположим, что я действительно предоставляю правильное имя пользователя api и пароль. Когда я вызываю приведенный выше код, я получаю следующую ошибку: "этот сервер не может проверить, что вы авторизованы для доступа к запрошенному документу. Либо вы ввели неверные учетные данные (например, неверный пароль), либо ваш браузер не понимает, как предоставить необходимые учетные данные."
Что я делаю не так? Есть предложения?
Richard Deeming
Ваш Delphi-код, похоже, не устанавливает файл cookie: OBBasicAuth=fromDialog
В противном случае вы можете попробовать захватить трафик из обеих версий, чтобы увидеть, в чем разница между запросами.
Member 11923969
Есть какие-нибудь предложения о том, как его добавить? Не смог реализовать ... 2-3 строки кода были бы оценены по достоинству.
Member 11923969
в запрос добавлен следующий код:
IdHTTP.CookieManager := TIdCookieManager.Создать(IdHTTP);
Ури := Тидури.Создать(requestURL);
IdHTTP.Cookiemanager, как.AddServerCookie('OBBasicAuth=fromDialog', URI);
Ури.бесплатно;
.. но я получаю тот же результат обратно.
Зарегистрировал запрос - выглядит так:
Отправлено 25.02.2018 7:47:18 PM: GET /DeliveryDates.xml?fromPostcode=2100&toPostcode=2001&networkId=01&lodgementDate=2018-02-25&numberOfDates=01 HTTP/1.1<eol>
Хост: api.auspost.com.au<eol>
Принимаем: текст/HTML,применение/с xhtml+xml,в приложение/XML;Q в=0.9,*/*;Q в=0.8&ЛТ;Эол&ГТ;принять кодирования: личности&ЛТ;Эол&ГТ;
Пользовательский агент: Mozilla/3.0 (совместимый; библиотека Indy)<eol>
Авторизация: базовая ODEzNmM2NTktOTY2OC00ZTM3LWFjMzItodkwmwjjnthlm2zholn1y2nlc3mwmse=<eol>
Cookie: OBBasicAuth=fromDialog<eol><eol>