Как получить http-контент с веб-сайта https? - PullRequest
0 голосов
/ 12 апреля 2020

При получении запроса с защищенного URL-адреса появляется сообщение об ошибке Http для https://www.google.com: 0 Неизвестная ошибка.

Я пытаюсь проверить мобильное приложение ionic / angular , Когда я пытался с http запросами, у меня была проблема с Android 9, но с Android 7 работала нормально. В любом случае мне нужно установить свой бэкэнд на сервер publi c https. Итак, сейчас я тестирую по запросу https, и ни одна из версий 7 и 9 Android не работает.

Я использую Angular 7,

"@ionic/angular": "^4.6.1",
"@ionic-native/core": "^5.0.0",
"rxjs": "~6.5.1"

Я сделал эти небольшие функции в Чтобы упростить мою проблему.

внутри моего html файла у меня есть этот код:

myFile. html

  <ion-button
          (click)="onStartTest()"
  >Click me</ion-button>
  <p id="testme"></p>

myFile.page.ts

  onStartTest() {
    this.taskService.onTest().subscribe(result => {
      document.getElementById('testme').innerText = 'result ' + result;
      console.log(result);

    }, error => {
      document.getElementById('testme').innerText = error.message;
      console.log('Problem ', error.message);
    });
  }

myTask.service.ts

  onTest() {
    return this.http.get('https://www.google.com').pipe(
      catchError(err => {
        return throwError(err);
      })
    );
  }

Сначала я попробовал URL-адрес моего сервера, но изменил его на "https://www.google.com", чтобы убедиться, что backend правильный.

Также у меня есть файл interceptors.ts, который я использую для аутентификации, но я не авторизован, когда выполняю функцию onStartTest (), но я собираюсь поделиться им anw.

interceptors.ts

import {Injectable} from '@angular/core';
import {HttpEvent, HttpHandler, HttpInterceptor, HttpRequest} from '@angular/common/http';
import {Observable} from 'rxjs';

@Injectable()
export class TokenInterceptor implements HttpInterceptor {


  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    const token = localStorage.getItem('auth_token');
    let newHeaders = req.headers;

    if (token) {
      console.log(token);
      newHeaders = newHeaders.set('Authorization', 'Token ' + token);
      const modified = req.clone({
        headers: newHeaders
      });
      return next.handle(modified);
    } else {
      newHeaders = newHeaders.set('Content-Type', 'application/json');
      const modified = req.clone({
        headers: newHeaders
      });
      return next.handle(modified);
    }
  }
}

Я думаю, что это необходимые файлы для совместного использования для решения этой проблемы. Я также проверил URL Google с почтальоном, просто чтобы убедиться, что я должен получить статус 200

Postman GET request https://www.google.com

Я также знаю, что есть " директива add_header "(nginx), которая добавляет 'Allow-access-control-origin', когда код ответа равен 20x или 30x. Согласно моему скриншоту с Почтальоном, Google отвечает 200 статусом, но мое приложение все еще получает ошибку статуса 0.

Игнорировать первую ошибку. Это функция, которую я использую с http, когда приложение запускается. Сейчас я тестирую https.

Error from google chrome console

Network status

Я поверхностно пытался использовать ioni c -нативная библиотека HTTP, но мое приложение полностью упало.

Я также выполняю команду ionic serve --ssl, но все еще ничего.

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

Я попытался запросить у Dark Sky у Vanilla JavaScript, и он работает нормально. Так что что-то не так с угловой / ioni c стороной, а не с серверной.

Чего мне не хватает? Мне действительно нужно исправить эту проблему в ближайшее время! Я хочу отправить защищенный запрос на URL-адрес https и получить соответствующий ответ.

Ответы [ 2 ]

1 голос
/ 12 апреля 2020

Ваша основная проблема заключается в том, что вы пытаетесь создать API для небезопасного (http) местоположения небезопасного вызова (http://192....../mobile/tasks) из безопасного источника (https://localhost:8100).

Это ясно указано в сообщении об ошибке и это не разрешено, и на был получен ответ до

Ваша вторая проблема заключается в том, что в целях тестирования вы пытаетесь вызвать сторонний ресурс https с вашего веб-сайта. работает только в том случае, если сторонние ресурсы реализуют CORS, что не относится к Google и api.darksky. net. Отправка запроса GET с помощью Postman бесполезна, поскольку Postman не будет проверять заголовки CORS перед отображением ответа. хотите использовать Postman для проверки CORS, отправьте запрос OPTIONS этим ресурсам, и вы увидите, что нет заголовков CORS

0 голосов
/ 15 апреля 2020

Таким образом, ответ: MDN - CORS

По соображениям безопасности браузеры ограничивают перекрестные HTTP-запросы, инициируемые из сценариев. Например, XMLHttpRequest и Fetch API следуют политике одного источника. Это означает, что веб-приложение, использующее эти API, может запрашивать ресурсы только из того же источника, из которого было загружено приложение, если только ответ из других источников не содержит правильных заголовков CORS.

Это означает, что серверная часть Я использовал нужную дополнительную конфигурацию, так как я использовал сценарий политики «того же источника». Я думал, что у нас это было, потому что когда мы пытались из консоли браузера получить запрос, он работал нормально, но на мобильном телефоне - нет. У нас была настраиваемая конфигурация CORS, но мы изменили ее на django-cors-headers. Поскольку мы перешли на django-cors-headers, я мог правильно получить ответ от HTTP и HTTP-запросов. Другие ответы и комментарии были действительно полезны, чтобы сосредоточиться в правильном направлении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...