获取失败并出现错误:POST 415 & GET 405

Posted

技术标签:

【中文标题】获取失败并出现错误:POST 415 & GET 405【英文标题】:Fetch fail with ERROR : POST 415 & GET 405 【发布时间】:2021-10-16 11:10:21 【问题描述】:

我尝试修改此 Microsoft.docs 示例 => Call an ASP.NET Core web API with javascript 我想使用 fetch POST 发送usernamepassword,我的AccountController 应该返回Token 在执行此操作之前,我已经在 POSTMAN 和 Swagger 上测试了我的 login API,它有效!更新我解决了 POST ERROR 415,但仍然有 GET ERROR 405 ,有人能告诉我原因吗?谢谢!

我的错误: Imgur 我的测试:


  "username": "Genevieve",
  "password": "sss"

Curl

curl -X POST "https://localhost:5001/login" -H  "accept: text/plain" -H  "Content-Type: application/json" -d "\"username\":\"Genevieve\",\"password\":\"string\""
Request URL https://localhost:5001/login

Server response
Code    Details
200 
Response body
Download

  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJHZW5ldmlldmUiLCJqdGkiOiJmYjJhNjdlNC1hZWFjLTRkMTktOWU2ZC03NDk0ZTVmMWYwNzciLCJyb2xlcyI6IkFkbWluIiwibmJmIjoxNjI4ODM0NTcwLCJleHAiOjE2Mjg4MzgxNzAsImlhdCI6MTYyODgzNDU3MCwiaXNzIjoiYXBpMSJ9.8HqCMwAbm3KXMXTGo868dARfF1UfMC1BEniq01UfyFQ"

Response headers
 content-type: application/json; charset=utf-8 
 date: Fri13 Aug 2021 06:02:49 GMT 
 server: Kestrel 

我的 Javascript 代码:

function sendtoken()
    const token_name = document.getElementById('token_name');
    const data = 
        username : 'Genevieve',
        password : 'sss'
    ;
    fetch('login', 
        method: 'POST',
        headers: 
            'Accept' : 'application/json, text/plain, */*',
            'Content-Type': 'application/json'
        ,
        body : JSON.stringify(data)
    )
    .then(response => response.json())
    .then(() => 
        getToken();
    )
    .catch( error => console.error('Unable to send Token.', error));


function getToken()
    fetch('login')
    .then(response => response.json())
    .then( data => _displayToken(data))
    .catch( error => console.error('Unable to get Token.', error));


function _displayToken(data)
    const final = document.getElementById('Token');
    final.innerhtml = data.token ;
    console.log(data.token);

我的 API:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using api1.Helpers;
using api1.Models;
using api1.ViewModels;
using Microsoft.AspNetCore.Cors;

namespace api1.Controllers

    [ApiController]
    public class AccountController : ControllerBase
    
        private readonly JwtHelpers helpers;

        public AccountController(JwtHelpers helpers)
        
            this.helpers = helpers;
        
        [EnableCors("GetPolicy")]
        [HttpPost("login")]
        public ActionResult<LoginResult> Login(Login model)
        
            if (CheckPassword(model.Username,model.Password))
            
                return new LoginResult()
                    Token = helpers.GenerateToken(model.Username,"Admin",60)
                ;
            
            else
            
                return BadRequest();
            
        

        private bool CheckPassword(string username, string password)
        
            if(username == "Genevieve")
            
                return true;
            
            else
            
                return false;
            
        
    

【问题讨论】:

【参考方案1】:
fetch('login', 
    method: 'POST',
    headers: 
        'Accept' : 'application/json, text/plain, */*',
        'Content-Type': 'applicaiotn/json'
    ,
    body : JSON.stringify(data)

正如您在代码中看到的,您编写了“applicaiotn/json”,但拼写不正确。你得到一个 415(不支持的媒体)是有道理的,因为不支持“applicaiotn/json”。 修正拼写错误。

405(不允许使用方法)是因为您在“/login”处没有支持HTTP GET(方法类型)的端点。您需要添加另一个带有[HttpGet("login")] 的方法/端点。

我想这就是你要找的东西

    fetch('login', 
        method: 'POST',
        headers: 
            'Accept' : 'application/json, text/plain, */*',
            'Content-Type': 'application/json'
        ,
        body : JSON.stringify(data)
    )
    .then(response => response.json()
        .then( data => _displayToken(data)
      .catch( error => console.error('Unable to get Token.', error))))
   .catch( error => console.error('Unable to send Token.', error));

【讨论】:

哦,我修好了,谢谢。但是,我仍然有 ERROR 405,你能告诉我原因吗?谢谢 我明白你的意思。问题来了,我的 POST 方法将返回这个 "token":"????"。如何在不添加 GET 方法的情况下获取它?谢谢!我正在尝试你的答案,请稍等~ 谢谢@Alex,我终于在index.html上看到了我的token

以上是关于获取失败并出现错误:POST 415 & GET 405的主要内容,如果未能解决你的问题,请参考以下文章

python 请求:对天蓝色的 PUT 请求失败并出现 415 错误

POST JSON 失败,出现 415 Unsupported media type, Spring 3 mvc

POST 到 Jersey REST 服务收到错误 415 Unsupported Media Type

无法将http post请求发送到spring boot

使用 fetch 时 POST https://accounts.spotify.com/api/token 415 错误

解决了! - Spring boot:获取 415 不支持的媒体类型