【问题标题】:JSON 405 error:Method not allowedJSON 405 错误:方法不允许
【发布时间】:2016-01-13 05:41:24
【问题描述】:

我正在尝试通过单击“编辑”按钮将 intakeanswers.json 从 angularjs 表单发送到 java Web 服务,但我收到一个错误:“405 方法不允许”。我的 JSON 好吗?

Angular 和 HTML

<!DOCTYPE html>
<html ng-app="myappp">
<head>
<meta charset="ISO-8859-1">
<title>Insert title here</title>
<script src="lib/js/angular.min.js"></script>
<script src="lib/js/angular-route.min.js"></script>


<script src="lib/js/angular-ui-router.min.js"></script>

</head>
<body ng-controller="edit_ctrl">

<script type="text/javascript">
var myapp=angular.module('myappp',[])
myapp.controller('edit_ctrl',function($scope,$http){
$http.get("data/intakeanswers.json").success(function(data){
    $scope.dataJson=data;
    });
$scope.doEdit=function(){
    $scope.dataJs = angular.copy($scope.dataJson);

        var dat=angular.toJson($scope.dataJs);
        alert("hi");
         $http({
             url :    "http://localhost:8080/...../FormAnswers/Answers",
             method: 'POST',
             data : dat,
             headers: {'Content-Type': 'application/Json'},
       })};

});
</script>

<button ng-click="doEdit()">Edit</button>


</body>
 </html>

Java REST Web 服务代码:

@Path("/FormAnswers")
public class FormAnswersService {

private static final Logger logger =     Logger.getLogger(FormAnswersService.class);

@GET
@Path("/Answers")
@Produces(MediaType.TEXT_PLAIN)
@Consumes(MediaType.APPLICATION_JSON)
public String getAnswers(String id) {

    try{

        System.out.println(id);

    }
    catch(Exception e){
        logger.error(e.getMessage());           
    }
    return "response";  
}

JSON

 { 
"User_Id": "abcd",
"Form_Name": "Form",
"Answers": [{
                            "Question_Id": "1",
                            "Answer" :"a"
                                            },
                                            {
                            "Question_Id": "2",
                            "Answer" :"b"
                                            },
                                            {
                            "Question_Id": "3",
                            "Answer" :"c"
                                            }
                            ],
            "Section_Name": "Project Overview",
            "Answers": [{
                            "Question_Id": "4",
                            "Answer" :"d"
                                            },
                                            {
                            "Question_Id": "5",
                            "Answer" :"e"
                                            },
                                            {
                            "Question_Id": "6",
                            "Answer" :"f"
                                            }
                            ]                             

}

【问题讨论】:

  • headers: {'Content-Type': 'application/Json'}, 应该是 headers: {'Content-Type': 'application/json'} 顺便说一句,为什么你的 json 中有多个答案?
  • 这可能对你有帮助:stackoverflow.com/questions/19143971/…
  • 我将 {'Content-Type': 'application/Json'} 更改为{'Content-Type': 'application/json'} 但仍然遇到同样的错误

标签: java angularjs json resteasy


【解决方案1】:

您的 Web 服务控制器仅声明了一个 GET 方法实现。您需要添加对 POST 的支持:

@POST
@Path("/Answers")
@Consumes(MediaType.APPLICATION_JSON)
public Response setAnswers(String data) {

}

由于您的网络服务不支持 POST,因此预计会出现 405。

【讨论】:

    【解决方案2】:

    您的网络服务代码需要一个 GET 请求,而您正在发送一个 POST。

    在这种情况下,我希望得到 405。

    变化:

    @GET
    @Path("/Answers")
    @Produces(MediaType.TEXT_PLAIN)
    @Consumes(MediaType.APPLICATION_JSON)
    

    收件人:

    @POST
    @Path("/Answers")
    @Produces(MediaType.TEXT_PLAIN)
    @Consumes(MediaType.APPLICATION_JSON)
    

    正如下面指出的那样,这将使您超过 405(因为您将使用正确的 http 请求方法,但是您的 java 服务仍然无法工作。您的端点需要一个字符串,而您的 POST 是json 文件。你需要返回一个响应,并且需要在你的 java 中解析 json,除非我错了。我对 java 的经验很少,因此无法提供帮助。

    【讨论】:

    • 我在 angularjs 中将方法更改为 GET,但仍然出现相同的错误
    • 您需要将 java 文件中的预期请求类型从 GET 更改为 POST(并将角度代码更改回 POST,您无法使用 GET 请求发送 json 文件)。将更新答案。
    • OP 不需要更改方法类型,而是添加 POST 方法的实现
    • 其实你是对的@RaunakAgarwal 来这里是为了角标签。唉,不是 Java 开发人员。更新答案以反映。
    【解决方案3】:

    如果服务只需要一个值 (id) 来检索答案,而不是发送 JSON,您可以使用 params 属性单独发送 id。但这会暴露 url 中的 id。

    示例:$http.get("/url/", {params:{"param1": val1, "param2": val2}}) .then(/* */)...

    注意:在 chrome 中检查从浏览器发送到服务的请求类型 1.按 Ctrl+F12。这将打开调试对话框。 2.刷新页面或调用服务。 3.在网络选项卡中,所有对服务的请求调用都会被记录下来。点击服务网址 4. 右侧将显示请求详细信息。在其中选择“标题”选项卡。签出请求方法:General 部分下的属性 5. 这将显示从浏览器发送的请求类型。这将确认您的更改是否生效。

    【讨论】:

    • OP 正在尝试发布数据而不是检索信息
    猜你喜欢
    • 1970-01-01
    • 2021-12-20
    • 2017-11-13
    • 2016-12-02
    • 2012-10-25
    • 2012-03-21
    • 2015-11-25
    • 2014-10-04
    • 2016-08-07
    相关资源
    最近更新 更多