Ioni c - API с laravel json ответом - PullRequest
       2

Ioni c - API с laravel json ответом

0 голосов
/ 02 февраля 2020

Я попытался создать пример приложения Ioni c с API с моим laravel проектом. Я сделал Laravel json ответные API-маршруты. Но на моей домашней странице Ioni c ничего не появляется, и она сообщает мне об этой ошибке: Access to XMLHttpRequest at 'http://b.1p1eqpotato.com/ib/?p=1' from origin 'http://localhost:8100' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: The value of the 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' when the request's credentials mode is 'include'. The credentials mode of requests initiated by the XMLHttpRequest is controlled by the withCredentials attribute. zone-evergreen.js:2952 POST http://b.1p1eqpotato.com/ib/?p=1 net::ERR_FAILED. А это console.log моих laravel сообщений (3) [{…}, {…}, {…}]0: {id: 1, name: "John Doe", course: "Udemy Academy", created_at: "2020-02-01 13:14:40", updated_at: "2020-02-01 13:14:40"}1: {id: 2, name: "Mike Doe", course: "Software Engineering", created_at: "2020-02-01 13:16:43", updated_at: "2020-02-01 13:16:43"}2: {id: 3, name: "Trevor Doe", course: "Api Ionic Laravel", created_at: "2020-02-01 13:58:24", updated_at: "2020-02-01 13:58:24"}length: 3__proto__: Array(0) udnefined home.page.ts:24

Так вот мой код Ioni c.

Мой app.module.ts:

import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { RouteReuseStrategy } from '@angular/router';

import { IonicModule, IonicRouteStrategy } from '@ionic/angular';
import { SplashScreen } from '@ionic-native/splash-screen/ngx';
import { StatusBar } from '@ionic-native/status-bar/ngx';

import { AppComponent } from './app.component';
import { AppRoutingModule } from './app-routing.module';
import { HttpClientModule, HttpClient } from '@angular/common/http';

@NgModule({
    declarations: [ AppComponent ],
    entryComponents: [],
    imports: [ BrowserModule, IonicModule.forRoot(), AppRoutingModule, HttpClientModule ],
    providers: [ StatusBar, SplashScreen, { provide: RouteReuseStrategy, useClass: IonicRouteStrategy } ],
    bootstrap: [ AppComponent ]
})
export class AppModule {}

Мой api.service.ts:

import { Injectable } from '@angular/core';
import { Observable, of, throwError } from 'rxjs';
import { HttpClient, HttpHeaders, HttpErrorResponse } from '@angular/common/http';
import { catchError, tap, map } from 'rxjs/operators';

const httpOptions = {
  headers: new HttpHeaders({'Content-type': 'applications/json'})
}

const apiUrl = "http://localhost:8000/api/students";

@Injectable({
  providedIn: 'root'
})
export class ApiService {

  constructor(private http: HttpClient) { }

  private handleError(error: HttpErrorResponse) {
    if(error.error instanceof ErrorEvent) {
      console.error('An error occurred:', error.error.message);
    } else {
      console.error(
        `Backend returned code ${error.status},` +
        `body was: ${error.error}`
      );
    }
    return throwError('Something is wrong, please try again.');
  }

  private extractData(res: Response) {
    let body = res;
    return body || { };
  }

  getDataUser(): Observable<any> {
    return this.http.get(apiUrl, httpOptions).pipe(
      map(this.extractData),
      catchError(this.handleError)
    );
  }
}

Это home.page.ts:

import { Component } from '@angular/core';
import { ApiService } from './../api.service';

@Component({
  selector: 'app-home',
  templateUrl: 'home.page.html',
  styleUrls: ['home.page.scss'],
})
export class HomePage {
  datauser: any;
  constructor(
    public api: ApiService
  ) {}

  ngOnInit(){
    this.getDataUser();
  }

  async getDataUser() {
    await this.api.getDataUser()
      .subscribe(res => {
        console.log(res);
        this.datauser = res.results;
    console.log(this.datauser);
      }, err => {
        console.log(err);
      });
  }
}

А это мой home.page.html:

<ion-header>
  <ion-toolbar>
    <ion-title>
      Ionic Blank
    </ion-title>
  </ion-toolbar>
</ion-header>

<ion-content>
  <ion-list>
    <ion-item *ngFor="let data of datauser">
      {{data.name}}
    </ion-item>
  </ion-list>
</ion-content>

Так оно и есть показывает мне array в консоли, но на домашней странице ничего нет. И эта ошибка: есть какие-то решения для не показа на представлении и этой XMLHttpRequest ошибке? Пожалуйста помоги! Спасибо

EDITED

Это мои ApiController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Student;

class ApiController extends Controller
{
    public function getAllStudents() {
        // logic to get all students goes here
        $students = Student::get()->toJson(JSON_PRETTY_PRINT);
        return response($students, 200);
      }

      public function createStudent(Request $request) {
        // logic to create a student record goes here
        $student = new Student;
        $student->name = $request->name;
        $student->course = $request->course;
        $student->save();

        return response()->json([
            "message" => "student record created"
        ], 201);
      }

      public function getStudent($id) {
        // logic to get a student record goes here
      }

      public function updateStudent(Request $request, $id) {
        // logic to update a student record goes here
      }

      public function deleteStudent ($id) {
        // logic to delete a student record goes here
      }
  }

Это мои api.php маршруты:

<?php

use Illuminate\Http\Request;

/*
|--------------------------------------------------------------------------
| API Routes
|--------------------------------------------------------------------------
|
| Here is where you can register API routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| is assigned the "api" middleware group. Enjoy building your API!
|
*/

Route::middleware('auth:api')->get('/user', function (Request $request) {
    return $request->user();
});

Route::get('students', 'ApiController@getAllStudents');
Route::get('students/{id}', 'ApiController@getStudent');
//Route::post('students', 'ApiController@createStudent');
Route::put('students/{id}', 'ApiController@updateStudent');
Route::delete('students/{id}','ApiController@deleteStudent');

И это моя Student.php модель:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Student extends Model
{
    protected $table = 'students';

    protected $fillable = ['name', 'course'];
}

1 Ответ

1 голос
/ 02 февраля 2020

Согласно веб-сайту разработчика Mozilla, CORS происходят, когда веб-приложение пытается отправить запросы на ресурс, источник которого (домен, протокол и порт) отличается от своего собственного источника. В моем случае запрос http был сделан с того же хоста, что и целевой ресурс (localhost), но с другим номером порта.

Решение

Если вы Google «Как исправить / разрешить CORS », и вы обнаружите, что некоторые веб-сайты говорят вам добавить дополнительные заголовки к вашему HTTP-ответу, изменив конфигурацию веб-сервера. Но есть и другой способ, которым вы можете воспользоваться, если у вас мало опыта в настройке сервера или вы не можете связаться с ребятами, чтобы попросить их о помощи, исправьте это с помощью Middleware.

Что такое Middleware?

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

Теперь давайте перейдем к шаг за шагом. шаг:

Создать класс Создать новый файл CorsMiddleware.php внутри каталога app\Http\Middleware

<?php

/**
* Location: /app/Http/Middleware
*/
namespace App\Http\Middleware;

use Closure;

class CorsMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $headers = [
            'Access-Control-Allow-Origin'      => '*',
            'Access-Control-Allow-Methods'     => 'POST, GET, OPTIONS, PUT, DELETE',
            'Access-Control-Allow-Credentials' => 'true',
            'Access-Control-Max-Age'           => '86400',
            'Access-Control-Allow-Headers'     => 'Content-Type, Authorization, X-Requested-With'
        ];

        if ($request->isMethod('OPTIONS'))
        {
            return response()->json('{"method":"OPTIONS"}', 200, $headers);
        }

        $response = $next($request);
        foreach($headers as $key => $value)
        {
            $response->header($key, $value);
        }

        return $response;
    }
}

Этот класс используется для изменения заголовка Http-ответа, здесь важна строка номер 22, где мы говорим браузеру принять запрос из любых источников (*)

'Access-Control-Allow-Origin' => '*'

Зарегистрировать промежуточное ПО

Чтобы сделать класс CorsMiddleware известным Laravel рядом с вами Необходимо зарегистрировать его в app\Http\Kernel.php

$app->middleware([
    //...
    App\Http\Middleware\CorsMiddleware::class
]);

Теперь вы должны найти эту ошибку не более.

Полный источник чтения

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