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 请求中不起作用