在React.js中使用axios发送POST请求的问题

SAM

大家好,我在前端使用Reactjs和Redux,我想创建新文章,所以我如下创建CreateArticle.js

import { useDispatch, useSelector } from 'react-redux'
import { unwrapResult } from '@reduxjs/toolkit'

import { addNewArticle } from './managementSlice'

import { selectAccessToken, selectUser } from '../authentications/authenticationsSlice'

import './CreateArticle.scss';
import { selectAllSubjects, fetchSubjects } from '../subjects/subjectsSlice';
import { selectAllTags, fetchTags } from '../tags/tagsSlice';

export const CreateArticle = () => {

  const [title, setTitle] = useState('')
  const [body, setBody] = useState('')
  const [slug, setSlug] = useState('')
  
  const [subjectId, setSubjectId] = useState(0)
  const [tags, setTags] = useState([])

  const [addRequestStatus, setAddRequestStatus] = useState('idle')

  const user = useSelector(selectUser);
  const subjects = useSelector(selectAllSubjects)
  const allTags = useSelector(selectAllTags)


  const subjectStatus = useSelector((state) => state.subjects.status)
  const tagStatus = useSelector( (state) => state.tags.status)

  const dispatch = useDispatch()

  // const onSubjectChanged = (e) => setSubjectId(parseInt(e.target.value))
  const onSubjectChanged = (e) => setSubjectId(e.target.value)

  const onTitleChanged = (e) => {
    setTitle(e.target.value) 
    setSlug(e.target.value.toLowerCase())}
  const onBodyChanged = (e) => {
    setBody(e.target.value)
    console.log(e.target.value);
  }

  const onTagsChanged = (e) => {
    const selectedOptions = [...e.target.selectedOptions].map(o => parseInt(o.value))
    setTags(selectedOptions)
  }




  const onSaveArticleClicked = async () => {
  
    let article = { Subject:subjectId, Title: title, Body:body, Tags:tags, Slug:slug } 

    if (user){
      try {
        setAddRequestStatus('pending')
        console.log('addRequestStatus:', addRequestStatus)
        const resultAction = await dispatch(
          addNewArticle(article)

          )
        unwrapResult(resultAction)
        setTitle('')
        setBody('')
        setTags([])
      
        setSlug('')
        console.log('resultAction:', resultAction)
      } catch (err) {
        console.error('Failed to save the article: ', err)
      } finally {
        setAddRequestStatus('idle')
      }
    }
    
  }



  useEffect( () => 
  {
    if (subjectStatus === 'idle') {
      dispatch(fetchSubjects())
    }
  }, 
  [subjectStatus, dispatch]
  )

  let subjectsOptions
  
  if (subjectStatus === 'loading') {

    subjectsOptions = <div className="loader"> Loading... </div>

  } else if (subjectStatus === 'succeeded') {

    subjectsOptions = subjects.map((subject) => (
      <option key={subject.id} value={subject.id} >
        {subject.title}
      </option>
    ))

  } else if (subjectStatus === 'error') {
    subjectsOptions = <div> Something went wrong </div>
  }


  useEffect( () => 
  {
    if (tagStatus === 'idle') {
      dispatch(fetchTags())
    }
  }, 
  [tagStatus, dispatch]
  )

  let tagsOptions
  
  if (tagStatus === 'loading') {

    tagsOptions = <div className="loader"> Loading... </div>

  } else if (tagStatus === 'succeeded') {

    tagsOptions = allTags.map((tag) => (
      <option key={tag.id} value={tag.id} >
        {tag.title}
      </option>
    ))

  } else if (tagStatus === 'error') {
    tagsOptions = <div> error </div>
  }



  return (
    <div className="create-article">
      <div className="create-article-head">

      </div>
      <form className="create-article-form" >
        <label htmlFor="article-title">Article Title:</label>
        <input
          type="text"
          className="article-title-input"
          id="id-article-title-input"
          name="title"
          placeholder="What's on your mind?"
          value={title}
          onChange={onTitleChanged}
        />
        <label htmlFor="article-subject">subject:</label>
        <select 
          id="id-subjects-article-select" 
          className="subjects-article-select" 
          onChange={onSubjectChanged}>
          <option value="">
            انتخاب موضوع
          </option>
          {subjectsOptions}
        </select>

        <label htmlFor="article-tags">tags:</label>
        <select 
          id="id-tags-article-select" 
          className="tags-article-select" 
          onChange={onTagsChanged}
          multiple
        >
          <option value="">
            SELECT TAGS
          </option>
          {tagsOptions}
        </select>


        <label htmlFor="article-body">Body:</label>
        <textarea
          className="article-body-textarea"
          id="id-article-body-textarea"
          name="body"
          value={body}
          onChange={onBodyChanged}
        />
        <button 
          type="button" 
          onClick={onSaveArticleClicked} 
          
        >
          Save Article
        </button>
      </form>
    </div>
  )
}

然后我创建了managementSlice.js,将数据发送到服务器,如下所示:

import {
   createSlice,
   createAsyncThunk,
   createEntityAdapter,
 } from '@reduxjs/toolkit'
//  import axios from 'axios';

// with below import axios workes correctly
import * as axios from 'axios';

 const managementAdapter = createEntityAdapter()
 
const initialState = managementAdapter.getInitialState({
   status: 'idle',
   error: null,
})
 


export const fetchMyArticles = createAsyncThunk('myArticles/fetchMyArticles', async () => {

   // const accessToken = useSelector(selectAccessToken);
   const accessToken = localStorage.getItem('access_token')
   const ARTICLES_PATH = 'http://127.0.0.1:8000/articles_api/v1/management/';


   const response = await axios(ARTICLES_PATH, 
      { headers: { "Authorization": `Bearer ${accessToken}` }})

   const data = response;
   console.log( 'fetchMyArticles: ', data)
   return response.data
 })

 export const addNewArticle = createAsyncThunk(
   'management/addNewArticle',
  async (initialArticle) => {

    const accessToken = localStorage.getItem('access_token')
    const ARTICLE_CREATE_PATH = 'http://127.0.0.1:8000/articles_api/v1/management/';
 
    console.log("before send new article to server:", initialArticle)
    try {
      const response = await axios.post(ARTICLE_CREATE_PATH, initialArticle , 
        { headers: { 
                    "Authorization": `Bearer ${accessToken}`, 
                    'Content-Type' : 'application/json; charset=UTF-8',
      }})      
      console.log('what the hell:', response);
    } catch (error) {
      console.error('erroroo',error.response.data);
    }

  }   
 )
 
 const managementSlice = createSlice({
   name: 'management',
   initialState,
   reducers: {},
   extraReducers: {
     [fetchMyArticles.pending]: (state, action) => {
       state.status = 'loading'
     },
     [fetchMyArticles.fulfilled]: (state, action) => {
       state.status = 'succeeded'
       // Add any fetched articles to the array
       managementAdapter.upsertMany(state, action.payload)
     },
     [fetchMyArticles.rejected]: (state, action) => {
       state.status = 'failed'
       state.error = action.payload
     },
     [addNewArticle.fulfilled]: managementAdapter.addOne,
   },
 })
 
  export const { 
  } = managementSlice.actions
 
 export default managementSlice.reducer
 
 export const {
   selectAll: selectMyArticles,
   selectById: selectMyArticleById,
   selectIds: selectMyArticleIds,
 } = managementAdapter.getSelectors((state) => state.management)
 

但发送请求后,我收到400错误的请求错误。我不理解我做错了哪一部分?我的后端是使用Django,并通过邮递员进行了测试,当我通过邮递员发送数据时也可以

开发者爱玛

.NET Web API遇到相同的问题。这将是axios请求标头/正文问题。您应该将发布请求的标头设置为:

headers: {
          'content-type': 'application/json',
     }

或者尝试将请求正文作为表单数据发送为:

let formData = new FormData()

formdata.append('name', yourJson)

await axios({
  method: 'post',
  url: '/your/url',
  data: formData,
  headers: {
    'Content-Type': 'multipart/form-data',
  },
})

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在带有 redux 形式的 react js 中不使用 axios 发送 post 请求(在 post 请求中不发送任何内容)

我在 react 中使用 axios post 时遇到问题

使用Axios发送多个请求的查询-React

在React中使用Axios进行调用的问题

如何在 React 应用程序中使用 Fetch 向 Flask API 发送 POST 请求

React和axios-发送GET和POST请求而不是仅发送POST

无法使用React Native和Axios发送请求

如何解决 axios post 请求问题,该问题未显示在 react 上的 get 请求中

React-使用axios的GET和POST请求

React.js,Node.js:在React中发送axios请求

React中的POST请求问题

React / Axios发送无限数量的请求

使用axios删除请求-React

在 react-native 中发送请求标头/授权 axios.post

如何在React js中使用axios将一个或多个文件发送到API?

使用 axios 获取请求的结果填充对象(在 React js 中)

在React函数中使用Axios

在 React JS web 应用中使用 Axios 调用 Rest Api

如何在 React JS 中使用 Redux 和 Axios?

在React.js中使用axios插入select的值

从React JS axios发送请求时未提供身份验证凭证

如何在 React JS Axios 中将请求有效负载作为可选的 api 调用发送

axios请求被阻止| React.js

将图像上传到 Cloudinary Express.js React Axios post 请求

使用 React.JS 获取 POST 请求消息

使用 Axios 的简单 React API 请求

使用 Axios 从 React 到 mongodb 的 PUT 请求

当 React.js 应用程序向 Django 后端发送请求时出现 CORS 问题

在 Sublime 中使用 React 的问题