Есть ли любой хороший пример загрузки http пользующаяся библиотека C++ WinInet

Я немного не синхронизирован с веб-программированием, и проникновение в HTMLUnit немного более запутанно, чем я думал.

blockquote>

Если вы хотите автоматизировать веб-страницу в наши дни, вам необходимо общее представление о веб-технологиях, по крайней мере, Html, Javascript и самом HTTP, чтобы понять, что делать.

Давайте начнем с верха - с вашей

прекрасной ошибкой

blockquote>

В качестве отправной точки откройте страницу в реальном браузере и посмотрите на веб приставка. Там вы увидите ту же ошибку; это означает, что на странице, которую вы пытаетесь автоматизировать, есть ошибка (по крайней мере, одна), и ваш браузер просто игнорирует это. HtmlUnit был создан как инструмент тестирования; из-за этого более требовательны к ошибкам. Вы должны отключить это.

webClient.getOptions().setThrowExceptionOnScriptError(false);

Следующий шаг: вы пытаетесь получить доступ к форме на странице

Поскольку имя метода подразумевает, что getFormByName () может найти формы, имеющие правильный атрибут name - но Ваша форма не имеет.

Следующий шаг:


Поскольку имя метода подразумевает, что 'getElementById ("201910") "может найти элементы, имеющие правильный атрибут id - но у вашего переключателя такого нет. [1113 ]

И то же самое для кнопки. Ниже вы можете найти быстрый взлом, который делает эту работу. Это может помочь прочитать хотя бы страницу HtmlUnit - Начало работы с HtmlUnit . Также доступен Javadoc с подробными описаниями.

Надеюсь, это поможет

public static void main(String[] args) throws IOException {
    String url = "https://mystudentrecord.ucmerced.edu/pls/PROD/xhwschedule.p_selectsubject";

    try (final WebClient webClient = new WebClient()) {
        webClient.getOptions().setThrowExceptionOnScriptError(false);

        HtmlPage page = webClient.getPage(url);
        webClient.waitForBackgroundJavaScript(1000);
        page = (HtmlPage) webClient.getCurrentWindow().getEnclosedPage();

        final HtmlForm form =  page.getForms().get(0);
        for (DomElement elem : form.getElementsByTagName("INPUT")) {
            if (elem instanceof HtmlRadioButtonInput) {
                HtmlRadioButtonInput radioButton = (HtmlRadioButtonInput) elem;
                if ("201910".equals(radioButton.getValueAttribute())
                        || "N".equals(radioButton.getValueAttribute())) {
                    radioButton.setChecked(true);
                }
            }
        }

        for (DomElement elem : form.getElementsByTagName("INPUT")) {
            if (elem instanceof HtmlSubmitInput) {
                if ("View Class Schedule".equals(elem.getAttribute("value"))) {
                    elem.click();
                }
            }
        }
        webClient.waitForBackgroundJavaScript(1000);
        page = (HtmlPage) webClient.getCurrentWindow().getEnclosedPage();

        System.out.println("----------------");
        System.out.println(page.asXml());
    }
}
5
задан michael 22 January 2009 в 22:58
поделиться

2 ответа

Вот быстрый пример от Microsoft.

   static TCHAR hdrs[] =
      _T("Content-Type: application/x-www-form-urlencoded");
   static TCHAR frmdata[] =
      _T("name=John+Doe&userid=hithere&other=P%26Q");
  static LPSTR accept[2]={"*/*", NULL};

   // for clarity, error-checking has been removed
   HINTERNET hSession = InternetOpen("MyAgent",
      INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
   HINTERNET hConnect = InternetConnect(hSession, _T("ServerNameHere"),
      INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 1);
   HINTERNET hRequest = HttpOpenRequest(hConnect, "POST",
      _T("FormActionHere"), NULL, NULL, accept, 0, 1);
   HttpSendRequest(hRequest, hdrs, strlen(hdrs), frmdata, strlen(frmdata));
   // close any valid internet-handles

Пример прибывает отсюда.

1
ответ дан 13 December 2019 в 19:37
поделиться

В конечном счете я нашел некоторый рабочий пример в сети

static char szRawData[5000];
  memset(szRawData, 0x11, sizeof(szRawData));

  //
  // CIHandle is just a wrapper class for HINTERNET, that closes handle in destructor
  //
  CIHandle hIntrn = InternetOpen( "LiveUpdate"), 
                                  INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY,
                                  NULL,
                                  NULL,
                                  0);
  if (!hIntrn)
    return printf("No Internet connection: %li.\n", GetLastError());

  CIHandle hConn = InternetConnect( hIntrn, 
                                    "65.254.250.104",
                                    INTERNET_DEFAULT_HTTP_PORT,
                                    NULL,
                                    NULL,
                                    INTERNET_SERVICE_HTTP,
                                    0,
                                    NULL);
  if (!hConn)
    return printf("Connection to update server failed: %li.\n", GetLastError());

  DWORD dwOpenRequestFlags = INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP |
                             INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTPS |
                             INTERNET_FLAG_KEEP_CONNECTION |
                             INTERNET_FLAG_NO_AUTO_REDIRECT |
                             INTERNET_FLAG_NO_COOKIES |
                             INTERNET_FLAG_NO_CACHE_WRITE |
                             INTERNET_FLAG_NO_UI |
                             INTERNET_FLAG_RELOAD;

  CIHandle hReq = HttpOpenRequest(hConn,
                                  "POST",
                                  "upload.php",
                                  "HTTP/1.0",
                                  NULL,
                                  NULL,
                                  dwOpenRequestFlags,
                                  NULL);

  ZString strBoundary = "---------------------------autoupdater";
  ZString strContentHeader =  "Host: www.mydomain_at_powweb.com\r\n"
                              "Content-Type: multipart/form-data; boundary=";
  strContentHeader+=strBoundary;

  HttpAddRequestHeaders(hReq, strContentHeader, strContentHeader.length(), HTTP_ADDREQ_FLAG_ADD);


  ZString strHeaders;
  strHeaders.precache(16384);
  sprintf(strHeaders,
          "--%s\r\n"
          "Content-Disposition: form-data; name=\"userfile\"; "
          "filename=\"test.raw\"\r\n"
          "Content-Type: application/octet-stream\r\n\r\n",
          (LPCTSTR)strBoundary);

  tCharSeq s;//this is a just a dynamic array of bytes;
  //
  // append headers and file to request:
  //
  s.precache(16384);
  s.append(strHeaders.length(), strHeaders);
  //append with file data:
  s.append(2000, szRawData); //<------------------- depending on this size, SendRequest fails.
  //trailing end of data:
  s.append(4,"\r\n--");
  s.append(strBoundary.length(), (LPTSTR)strBoundary);
  s.append(4,"--\r\n");

  InternetSetOption(hReq, INTERNET_OPTION_USERNAME, "username\0", 9);
  InternetSetOption(hReq, INTERNET_OPTION_PASSWORD, "password\0", 9);

  if (!HttpSendRequest(hReq, NULL, 0, (void*)s.getBuffer(), s.length()))
    return printf("HttpSendRequest failed: %li.\n", GetLastError());
9
ответ дан 13 December 2019 в 19:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: