Member 11923969 Ответов: 2

Мне нужно перевести 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>

2 Ответов

Рейтинг:
2

Member 11923969

Эти 2 ссылки не показывают больше, чем я уже сделал в своем коде ...

Рейтинг:
2

Member 11923969

Похоже, что он работает с CookieManager и также должен был добавить '@auspost.com.au-к предоставленному ключу API ...