为啥我在执行 POST 请求时收到 405 Method Not Allowed

Posted

技术标签:

【中文标题】为啥我在执行 POST 请求时收到 405 Method Not Allowed【英文标题】:Why am i getting 405 Method Not Allowed while doing a POST Request为什么我在执行 POST 请求时收到 405 Method Not Allowed 【发布时间】:2015-03-09 13:16:18 【问题描述】:

我是其他服务的新手。我正在尝试创建一个接受来自客户端的 json 字符串的服务。使用 JQuery 调用此服务时出现 405 错误。下面是ws的Java代码:

这是我向 JERSEY POST RESTFUL Webservice 发布请求的方式。

var orderinfo = 'ordersplitjson': ordersplitjson, 'customer_id': cust_id , 'homedelivery': homedelivery, 'seatnum' :seatnum , 'locationname':location_nam , 'rownum':rownum; 
var json_data =  JSON.stringify(orderinfo);
        var ajaxcallquery = $.ajax(
            type:'POST',
              dataType: 'jsonp',
             data: json_data,
             contentType: "application/json; charset=utf-8",
            url:url+'/OMS/oms1/orderinsertservice',
            jsonpCallback:'jsonCallback',
            jsonp:false,
            success: function(response) 
            
            ,
            error: function(jqxhr, status, errorMsg) 
            alert('Failed! ' + errorMsg);
        

        );


 public class OrdersInsertService 

    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces("application/json")
    public String getData(OrderInfo order,@Context HttpServletResponse serverResponse)
    throws JSONException
            
         serverResponse.addHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD");
            serverResponse.addHeader("Access-Control-Allow-Credentials", "true");
            serverResponse.addHeader("Access-Control-Allow-Origin", "*");
           serverResponse.addHeader("Access-Control-Allow-Headers", "Content-Type,X-Requested-With");
            serverResponse.addHeader("Access-Control-Max-Age", "60");





package com.util;

public class OrderInfo 

    String ordersplitjson;
    public String getOrdersplitjson() 
        return ordersplitjson;
    
    public void setOrdersplitjson(String ordersplitjson) 
        this.ordersplitjson = ordersplitjson;
    
    public String getCustomer_id() 
        return customer_id;
    
    public void setCustomer_id(String customer_id) 
        this.customer_id = customer_id;
    
    public String getHomedelivery() 
        return homedelivery;
    
    public void setHomedelivery(String homedelivery) 
        this.homedelivery = homedelivery;
    
    public String getSeatnum() 
        return seatnum;
    
    public void setSeatnum(String seatnum) 
        this.seatnum = seatnum;
    
    public String getLocationname() 
        return locationname;
    
    public void setLocationname(String locationname) 
        this.locationname = locationname;
    
    public String getRownum() 
        return rownum;
    
    public void setRownum(String rownum) 
        this.rownum = rownum;
    
    String customer_id;

    String homedelivery;
    String seatnum;

    String locationname;
    String rownum;



谁能告诉我如何解决这个问题

我正在使用 Jersey 1,当我使用你的课程时,它在 eclipse 中给了我一个编译错误,就像图片中的 hwon 一样

【问题讨论】:

我刚刚将 jsonp 替换为 json ,我得到请求的资源上没有“Access-Control-Allow-Origin”标头。因此,不允许访问 Origin 'null'。 摆脱所有与 jsonp 相关的东西。 jsonp 将自动生成 GET(因此是 405)。带 POST 的 jsonp 不好。 当我将 jsonp 修改为 json 时,请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,不允许访问 Origin 'null'。 我什至将我的代码修改为 public String getData(OrderInfo order,@Context HttpServletResponse serverResponse) throws JSONException serverResponse.addHeader("Access-Control-Allow-Methods", "GET, POST, PUT,删除、选项、头"); serverResponse.addHeader("Access-Control-Allow-Credentials", "true"); serverResponse.addHeader("Access-Control-Allow-Origin", ""); serverResponse.addHeader("Access-Control-Allow-Headers", ""); serverResponse.addHeader("Access-Control-Max-Age", "60"); 405 表示不允许 GET。那是最初的问题。现在你似乎有一个cors问题。首先检查该方法是否被击中。使用打印语句。如果没有,请尝试使用 cors response fitler。过滤器见here 【参考方案1】:

(1) dataType: 'jsonp' 应该是 json。摆脱所有与jsonp 相关的东西。应该是json。 jsonp 将自动更改为 GET 请求,因此 405(不允许方法)。您的资源方法接受 POST。

(2) CORS 的问题。您需要一个过滤器来处理预飞行。如果你使用 Jersey 1,你可以使用这个类

import com.sun.jersey.spi.container.ContainerRequest;
import com.sun.jersey.spi.container.ContainerResponse;
import com.sun.jersey.spi.container.ContainerResponseFilter;

public class CORSFilter implements ContainerResponseFilter 
    @Override
    public ContainerResponse filter(ContainerRequest request,
            ContainerResponse response) 

        response.getHttpHeaders().add("Access-Control-Allow-Origin", "*");
        response.getHttpHeaders().add("Access-Control-Allow-Headers",
                "origin, content-type, accept, authorization");
        response.getHttpHeaders().add("Access-Control-Allow-Credentials", "true");
        response.getHttpHeaders().add("Access-Control-Allow-Methods",
                "GET, POST, PUT, DELETE, OPTIONS, HEAD");

        return response;
    

然后像这样注册

resourceConfig.getContainerResponseFilters().add(new CORSFilter());

使用 web.xml,添加这个

<init-param>
  <param-name>com.sun.jersey.spi.container.ContainerResponseFilters</param-name>
  <param-value>com.yourpackage.CORSFilter</param-value>
</init-param>

在包含 Jersey servlet 的 &lt;servlet&gt; 元素内

【讨论】:

嗨,我使用 Jersey 1,当我使用你的课程时,我在 eclipse 中遇到编译错误,就像我问题中的图片一样,请告诉我如何摆脱这个错误. 对不起,它给了我 - 实现 com.sun.jersey.spi.container.ContainerResponseFilter.filter - CORSFilter 类型的方法 filter(ContainerRequest, ContainerResponse) 必须覆盖超类方法 我不知道我没有问题。我从我的 IDE 复制并粘贴了上面的代码 对不起,我使用的是 JDK 1.5,重做 JDK 1.6,错误消失了。现在我如何访问 resourceConfig.getContainerResponseFilters().add(new CORSFilter());在我的 OrderInsertService 类中? 你是在使用 web.xml 还是 ResourceConfig 类的应用程序?

以上是关于为啥我在执行 POST 请求时收到 405 Method Not Allowed的主要内容,如果未能解决你的问题,请参考以下文章

为啥当我使用 Perl 的 REST::Client 发送 POST 请求,而不是使用 Perl 的 LWP::UserAgent 或 Python 时,我得到“405: Method Not All

向 Cassini Web 服务器发送请求 URI 为“/”的 POST 请求,导致 405 错误。为啥?

为啥我在尝试在 iOS Swift 中向服务器发出 post 请求时收到此错误:在展开 Optional 值时意外发现 nil?

405 上传文件时方法不允许

不允许 POST 请求 - 不允许 405 - nginx,即使包含标头

HTTP 状态 405 - 不支持请求方法“POST”(Spring MVC)