Jersey REST API 请求不起作用

Posted

技术标签:

【中文标题】Jersey REST API 请求不起作用【英文标题】:Jersey REST API request not working 【发布时间】:2016-07-27 21:22:59 【问题描述】:

这是我第一次使用 Web Service、Jersey、Jackson 和 REST API。 我已经了解了 Web 服务、Jersey、Jackson 和 REST API 的一些基础知识。

我使用 Netbeans IDE 开发了一个示例项目。

当我从浏览器调用我的 REST API 时,我收到以下错误,这是我使用开发人员工具发现的。

请求网址:http://localhost:8080/ImageShowcase/v1/user/login

请求方法:GET

状态码:405 方法不允许

远程地址:127.0.0.1:8080

以下是我在 Tomcat 7 日志中遇到的错误

严重:向 com.sample.jersey.app.MyServlet 类的侦听器实例发送上下文初始化事件的异常

java.lang.IllegalStateException:无法找到 API 密钥和机密。无法初始化应用程序。请确保您的 API Key 和 Secret 存储在 ~/.stormpath/apiKey.properties

这是我的项目结构:

在控制器包中,我有以下代码 User.java 包 com.sample.controller;

import com.sample.model.UserModel;
import com.sample.pojo.UserCredentials;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

@Path("/user")
public class User 

    @Path("/login")
    @POST 
    @Consumes("application/json")
    @Produces("application/json")
    public Response UserAuthentication(UserCredentials user) 


        String output = "\"username\":\"xyz\",\"password\":\"abc\"";

        UserModel userAuthentication = new UserModel();
        if(userAuthentication.AuthenticateUser(user))
            return Response.status(201).entity(output).build();
        else
            return Response.status(201).entity(output).build();
    

以下是我的 JerseyClient 代码

package com.sample.jerseyclient;


import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;

public class JerseyClient 

  public static void main(String[] args) 
    try 
            System.out.println("Client started");
        Client client = Client.create();

        WebResource webResource = client
           .resource("http://localhost:8080/ImageShowcase/v1/user/login");

        String input = "\"username\":\"demo\",\"password\":\"demo\"";
        // POST method
        ClientResponse response = webResource.accept("application/json")
                .type("application/json").post(ClientResponse.class, input);

        // check response status code
        if (response.getStatus() != 201) 
            throw new RuntimeException("Failed : HTTP error code : "
                    + response.getStatus());
        

        // display response
            String output = response.getEntity(String.class);
        System.out.println("Output from Server .... ");
        System.out.println(output + "\n");
     catch (Exception e) 
        e.printStackTrace();
    


    

以下是我的用户模型,我在其中实现我的业务逻辑(数据库等)。

package com.sample.model;

import com.sample.pojo.UserCredentials;
import java.sql.*;

public class UserModel 

    public boolean AuthenticateUser(UserCredentials user) 
        Database db = new Database();
        Connection con = null;

        try 
            String username = user.getUsername();
            String password = user.getPassword();
            ResultSet rs;

            con = db.getConnection();
            if (con != null) 
                String selectQuery_UserDetails = "SELECT NAME,PASSWORD FROM USER WHERE NAME=? AND PASSWORD = ?";

                PreparedStatement preparedStatement = con.prepareStatement(selectQuery_UserDetails);
                preparedStatement.setString(1, username);
                preparedStatement.setString(2, password);

                rs = preparedStatement.executeQuery(selectQuery_UserDetails);
                if (rs != null) 
                    return true;
                
                return false;
            
         catch (Exception e) 
            return false;
         finally 
            db.closeConnection(con);
        
        return true;
    

这是我的用户凭据 POJO 类:

package com.sample.pojo;

import org.codehaus.jackson.annotate.JsonProperty;

public class UserCredentials 

    @JsonProperty
    private String username;

    @JsonProperty
    private String password;


    public String getUsername() 
        return username;
    

    public String getPassword() 
        return password;
    

我没有明白我在这里做错了什么。 另一个我想知道的是,我使用的结构是否正确。

谢谢。

【问题讨论】:

请更新您的问题。从com.sample.jersey.app.MyServlet的相关代码开始。 ~/.stormpath/apiKey.properties 是 Stormpath 的提示,但这里没什么可看的。顺便说一句,请求方法实际上是 POST 而不是 GET 那是我很困惑的部分,即使我没有这样的包,也不知道为什么会这样显示。这是与 Build 相关的问题吗,因为在实施我的解决方案之前,我执行了一个包含此包的示例应用程序。非常感谢您的回复。 我想知道的另一件事是如何运行 JerseyClient。我可以使用邮递员来测试所有这些 api 吗? @zyexal : 我现在正在使用 POSTMAN 测试我的 API,我得到了 415 个不受支持的媒体类型,用于新项目和不同项目中的相同上述代码 我用相同的代码重新创建了项目,它对我有用。我认为在构建过程中出现了问题。 【参考方案1】:

虽然这是一个相当古老的线程,但我仍然觉得如果它可以使任何人受益的话,我还是会考虑一下。

确保在 web.xml 中设置以下内容

    <init-param>
        <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
        <param-value>true</param-value>
    </init-param>

【讨论】:

以上是关于Jersey REST API 请求不起作用的主要内容,如果未能解决你的问题,请参考以下文章

IIS Rest Api - 放置和删除请求不起作用 ERR_FAILED 403

ControllerAdvice 的异常处理程序在使用 Spring Boot 的 Rest API 获取请求中不起作用。如何解决?

Jersey API + JPA/Hibernate Criteria延迟加载不起作用

JSON stringify 中的变量在 Rest 请求中不起作用

Cloudinary REST api 销毁不起作用? [关闭]

WP REST API V2 不起作用