Запрос отправлен по оси ios, дважды Laravel - PullRequest
0 голосов
/ 16 января 2020

, поэтому я хочу отправить запрос на Laravel из внешнего интерфейса, используя ax ios, это перекрестное начало, поэтому внешний интерфейс находится в localhost:3000, а внутренний - в localhost:8000/api,

в Laravel Я уже применил промежуточное ПО CORS с this . в топоре ios я уже установил заголовки.

топор ios настройка

axios.defaults.baseURL = API_URL
axios.defaults.headers.common.Accept = 'application/json'
axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest'
axios.defaults.headers.common['Access-Control-Allow-Origin'] = '*'

топор ios сообщение и удаление:

 function create(){
    return dispatch => {
        return new Promise((resolve,reject)=>{
            HTTP.get('/post/category/create')
                .then((data)=>{
                    return resolve(data.data.data)
                }).catch((data)=>{
                    return reject(data)
                })
        })
    }
}
export function destroy(data){
    return dispatch => {
        return new Promise((resolve,reject)=>{
            HTTP.delete(`/post/category/${data}`)
                .then((data)=>{
                    return resolve(data.data)
                }).catch((data)=>{
                    return reject(data)
                })
        })
    }
}

как я вызываю функцию:

 var SubmitCategory = async (e) => {
        e.preventDefault();
        var formData = new FormData(e.target)
        await setSubmit(true);
        await props.dispatch(insert(formData))
            .then(data=>{
                toaster(data.message,data.status)
                props.history.replace({
                    pathname: `/post/category`
                })
            })
            .catch(data=>{
                toaster(data.message,"error")
                setError(data)
            })
        await setSubmit(false)
    }


<form autoComplete="off" onSubmit={e=>SubmitCategory(e)}> <<--- onSubmit
...////

как выглядит функция laravel:

public function store(Request $request)
{
    // return response()->json($request,500);
    try {
        DB::beginTransaction();
        $data = $request->all();

        $cat = Category::create($data);

        DB::commit();

        return response()->json([
            'status'     => 'success',
            'id'         => $cat->id,
            'code'       =>  200,
            'message'    => 'Category Created'
        ],200);

    } catch (\Exception $e) {
        DB::rollback();
        return response()->json([
            'status'     => 'error',
            'code'       =>  500,
            'message'    => $e->getMessage()
        ],500);
    }
}

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

Первой моей мыслью было то, что ax ios отправил два запроса, один из которых был OPTIONS, Я провел несколько исследований в Google, из-за которых его невозможно отключить, и по-другому, но ничего не получилось.

Редактировать Cors. php Файл

<?php

    'paths' => ['api/*'],
    'allowed_methods' => ['*'],
    'allowed_origins' => ['*'],
    'allowed_origins_patterns' => [],
    'allowed_headers' => ['*'],
    'exposed_headers' => [],
    'max_age' => 600,
    'supports_credentials' => false,

1 Ответ

2 голосов
/ 16 января 2020

Когда вы используете CORS, браузеру может потребоваться отправить запрос OPTIONS перед запросом GET. (Если это так, он делает это автоматически при выдаче GET с XMLHttpRequest / fetch / et c.) Вам нужно различать guish между запросом OPTIONS и GET запрашивать на стороне сервера и фактически выполнять работу только тогда, когда вы получаете GET, а не когда вы получаете OPTIONS до него.


Примечание: Access-Control-Allow-Origin - это ответ заголовок. Вы не должны указывать axios отправить его с запросом (это ничего не делает). Подробнее об этом здесь .. .

...