我正在尝试学习宁静的服务,作为其中的一部分,我正在设计一个示例请求和响应页面...看到我正在做的一切正确,除了以下 资源叫:
<i>
package com.tutorialspoint;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
@Path("/RestService")
public class CrunchifyRESTService {
@POST
@Path("/crunchifyService")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response crunchifyREST(InputStream incomingData) {
StringBuilder crunchifyBuilder = new StringBuilder();
try {
BufferedReader in = new BufferedReader(new InputStreamReader(incomingData));
String line = null;
while ((line = in.readLine()) != null) {
crunchifyBuilder.append(line);
}
} catch (Exception e) {
System.out.println("Error Parsing: - ");
}
System.out.println("Data Received: " + crunchifyBuilder.toString());
// return HTTP response 200 in case of success
return Response.status(200).entity(crunchifyBuilder.toString()).build();
}
@GET
@Path("/verify")
@Produces(MediaType.APPLICATION_JSON)
public Response verifyRESTService(InputStream incomingData) {
String result = "CrunchifyRESTService Successfully started..";
// return HTTP response 200 in case of success
return Response.status(200).entity(result).build();
}
@POST
@Path("/login")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public Response loginserv(newUser user){
String data="";
data=user.uname+" and auth "+user.pwd;
return Response.status(200).entity(data).build();
}
}
我正在使用的请求是POST,网址是 http://localhost:8080/com/rest/RestService/login/sudheer/123
我得到的回应是
的
的<!DOCTYPE html>
<html>
<head>
<title>Apache Tomcat/8.5.4 - Error report</title>
<style type="text/css">H1 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:22px;} H2 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:16px;} H3 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:14px;} BODY {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;} B {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;} P {font-family:Tahoma,Arial,sans-serif;background:white;color:black;font-size:12px;}A {color : black;}A.name {color : black;}.line {height: 1px; background-color: #525D76; border: none;}</style>
</head>
<body>
<h1>HTTP Status 415 - Unsupported Media Type</h1>
<div class="line"></div>
<p>
<b>type</b> Status report
</p>
<p>
<b>message</b>
<u>Unsupported Media Type</u>
</p>
<p>
<b>description</b>
<u>The server refused this request because the request entity is in a format not supported by the requested resource for the requested method.</u>
</p>
<hr class="line">
<h3>Apache Tomcat/8.5.4</h3>
</body>
</html>
的
回复标题
的
的Content-Language →en
Content-Length →1133
Content-Type →text/html;charset=utf-8
Date →Mon, 24 Oct 2016 06:35:48 GM
Ť的
并且知道代码的确切问题请告诉我
答案 0 :(得分:1)
不支持的媒体类型错误通常意味着请求的Content-type
标头不是服务器所期望的。在你的情况下,行
@Consumes(MediaType.APPLICATION_JSON)
表示您的REST API需要JSON请求。您尚未发布使用Postman发出的确切请求,但如果您在“标题”部分中添加了包含键Content-Type
和值application/json
的新条目,则该错误应该会消失。当然,请确保您的请求确实是正确的JSON格式 - 例如使用http://jsonlint.com验证请求。请求的正文应该是这样的:
{
uname : "sudheer",
pwd : "123"
}
答案 1 :(得分:1)
在pom.xml中添加以下依赖项
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>${jackson-version}</version> // 2.4.3
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson-version}</version> // 2.4.3
</dependency>
然后将控制器定义为: -
@POST
@Path("/login")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public Response loginserv(@RequestBody newUser user){
//I really hope you have newUser as your classname better follow Java conventions and rename it as NewUser
String data="";
data=user.uname+" and auth "+user.pwd;
return Response.status(200).entity(data).build();
}
要使用@RequestBody,最好使用<mvc:annotation-driven />
这个答案有点复制this。如果有效,请在那里投票。 :)
答案 2 :(得分:0)
对于POST请求,您不通过在路径中指定数据来发送数据。 相反,创建一个这样的包装类:
class User{
private String uname;
private String pwd;
// getter and setter methods
}
然后将服务写为:
@Path("/login")
public class LoginService {
@POST
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public Response loginserv(User user){
String data="";
data=user.uname+" and auth "+user.pwd;
return Response.status(200).entity(data).build();
}
}
我想,显示意外的's'是因为该服务不期望您传递的路径为URL。
答案 3 :(得分:0)
在您的情况下,我注意到2个错误: 1)您的错误描述清楚地表明, “服务器拒绝了此请求,因为请求实体所采用的方法所请求的资源不支持该格式”
您在请求中使用的内容类型是@Consumes(MediaType.APPLICATION_JSON),因此在请求中您必须以JSON格式提供 POST数据,如{“key1”:“value1”,“key2” “:”。VALUE2" } 强>
2)您收到了“意外”的回复,因为您正在制作响应内容类型@Produces(MediaType.APPLICATION_JSON),即JSON格式&amp;在发送响应时,您使用(.toString()方法)
创建String因此,使用 @Produces(MediaType.ALL_VALUE)来获取JSON以及响应中的字符串。
答案 4 :(得分:0)
在邮递员中打开“原始”标签(模式)以查看确切的文字回复。消息本身只是告诉“邮递员无法将收到的文本转换为[您选择的任何格式],因为意外的字符”。