错误 415 不支持的媒体类型:如果是 JSON,则 POST 未达到 REST,但如果是 XML,则可以
Posted
技术标签:
【中文标题】错误 415 不支持的媒体类型:如果是 JSON,则 POST 未达到 REST,但如果是 XML,则可以【英文标题】:Error 415 Unsupported Media Type: POST not reaching REST if JSON, but it does if XML 【发布时间】:2012-07-31 05:03:42 【问题描述】:我实际上是 REST WS 的新手,但我真的不明白这个 415 Unsupported Media Type
。
我正在 Firefox 上使用 Poster 测试我的 REST,GET
对我来说很好,POST
(当它是 application/xml
时)但是当我尝试 application/json
时它没有到达 WS根本没有,服务器拒绝它。
这是我的网址:http://localhost:8081/RestDemo/services/customers/add
这是JSON
我正在发送:"name": "test1", "address" :"test2"
这是XML
我正在发送:
<customer>
<name>test1</name>
<address>test2</address>
</customer>
这是我的资源类:
@Produces("application/xml")
@Path("customers")
@Singleton
@XmlRootElement(name = "customers")
public class CustomerResource
private TreeMap<Integer, Customer> customerMap = new TreeMap<Integer, Customer>();
public CustomerResource()
// hardcode a single customer into the database for demonstration
// purposes
Customer customer = new Customer();
customer.setName("Harold Abernathy");
customer.setAddress("Sheffield, UK");
addCustomer(customer);
@GET
@XmlElement(name = "customer")
public List<Customer> getCustomers()
List<Customer> customers = new ArrayList<Customer>();
customers.addAll(customerMap.values());
return customers;
@GET
@Path("/id")
@Produces("application/json")
public String getCustomer(@PathParam("id") int cId)
Customer customer = customerMap.get(cId);
return "\"name\": \" " + customer.getName() + " \", \"address\": \"" + customer.getAddress() + "\"";
@POST
@Path("/add")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON)
public String addCustomer(Customer customer)
//insert
int id = customerMap.size();
customer.setId(id);
customerMap.put(id, customer);
//get inserted
Customer result = customerMap.get(id);
return "\"id\": \" " + result.getId() + " \", \"name\": \" " + result.getName() + " \", \"address\": \"" + result.getAddress() + "\"";
编辑 1:
这是我的客户类:
@XmlRootElement
public class Customer implements Serializable
private int id;
private String name;
private String address;
public Customer()
public int getId()
return id;
public void setId(int id)
this.id = id;
public String getName()
return name;
public void setName(String name)
this.name = name;
public String getAddress()
return address;
public void setAddress(String address)
this.address = address;
【问题讨论】:
你的Customer
班级是什么样子的?你在上面使用了哪些 JAXB 注释?
谢谢,我用我的 Customer 类更新了代码。
【参考方案1】:
不要在您的方法中返回字符串,而是使用 Customer 对象自己,让 JAXB 负责反序列化。
【讨论】:
可能是,但我认为问题就在眼前,我根本没有使用服务。【参考方案2】:问题在于 bean Customer 的反序列化。您的程序知道如何在 XML 中使用 Daniel 编写的 JAXB,但很可能不知道如何使用 JSON。
这里有一个 Resteasy/Jackson 的例子 http://www.mkyong.com/webservices/jax-rs/integrate-jackson-with-resteasy/
与泽西岛相同: http://www.mkyong.com/webservices/jax-rs/json-example-with-jersey-jackson/
【讨论】:
在这些示例中,输入与我的完全相同,返回不同(如丹尼尔所说),但我的问题就在前面,我根本没有上课。 @Maged 你用的是resteasy还是jersey? @Maged 您是否按照文章中的说明更新了 web.xml? 是的,我确实添加了映射位添加Content-Type: application/json
和Accept: application/json
在 REST 客户端标题部分中
【讨论】:
REST 客户端标头部分在哪里? 如果您从命令行使用 curl 调用,则可以按如下方式添加标题: [$> curl -H "Content-Type: application/json" -X POST -d '"name ":"my_name","password":"123456"' localhost:8080/url] 需要你的帮助,我是这个rest api创建的新手,EST Client header部分在哪里? 对于从另一种语言到达这里并且该语言是 Ruby 并且您正在使用 rest-client 的任何人,这个答案对我有很大帮助。示例用法response = RestClient.post "https://pod12.salesforce.com/services/data/v33.0/sobjects/Contact/", Email: user.email, LastName: user.last_name, FirstName: user.first_name, Phone: user.phone.to_json, Authorization: "Bearer #access_token", :"Content-Type" => "application/json", :"Accept" => "application/json"
在 Python 方面也帮助过我。请记住将有效负载作为 JSON 传递:requests.post("/login", data = json.dumps(loginCredentials), headers = "Content-Type": "application/json", "Accept": "application/json")
【参考方案4】:
以防万一这对其他人有帮助,这是我的轶事:
由于我在使用 Postman 将测试数据发送到我的 RESTEasy 服务器时遇到的一个问题,我发现了这个线程,在一个重大的代码更改之后,我得到的只是 415 Unsupported Media Type 错误。
长话短说,我把所有东西都撕掉了,最终我尝试运行我知道可行的简单文件上传示例;它没有。那时我意识到问题出在我的邮递员请求上。我通常不发送任何特殊的标头,但在之前的测试中我添加了一个“Content-Type”:“application/json”标头。当然,我试图上传“multipart/form-data”。删除它解决了我的问题。
道德:在炸毁你的世界之前检查你的标题。 ;)
【讨论】:
+1 以获得“确保烤面包机已插入电源”的建议。刚遇到同样的问题,当您确信问题出在代码中时很容易忽略。【参考方案5】:我遇到了同样的问题:
curl -v -H "Content-Type: application/json" -X PUT -d '"name":"json","surname":"gson","married":true,"age": 32,"salary":123,"hasCar":true,"childs":["serkan","volkan","aybars"]' XXXXXX/ponyo/UserModel/json
* About to connect() to localhost port 8081 (#0)
* Trying ::1...
* Connection refused
* Trying 127.0.0.1...
* connected
* Connected to localhost (127.0.0.1) port 8081 (#0)
> PUT /ponyo/UserModel/json HTTP/1.1
> User-Agent: curl/7.28.1
> Host: localhost:8081
> Accept: */*
> Content-Type: application/json
> Content-Length: 121
>
* upload completely sent off: 121 out of 121 bytes
< HTTP/1.1 415 Unsupported Media Type
< Content-Type: text/html; charset=iso-8859-1
< Date: Wed, 09 Apr 2014 13:55:43 GMT
< Content-Length: 0
<
* Connection #0 to host localhost left intact
* Closing connection #0
我通过将依赖项添加到 pom.xml 来解决它,如下所示。请尝试一下。
<dependency>
<groupId>com.owlike</groupId>
<artifactId>genson</artifactId>
<version>0.98</version>
</dependency>
【讨论】:
【参考方案6】:遇到了这个问题,发现问题是我没有注册JacksonFeature类:
// Create JAX-RS application.
final Application application = new ResourceConfig()
...
.register(JacksonFeature.class);
如果不这样做,您的应用程序将不知道如何将 JSON 转换为 java 对象。
https://jersey.java.net/documentation/latest/media.html#json.jackson
【讨论】:
你能再解释一下吗?我几乎尝试了一切,我想我错过了这一点。我应该在哪里注册?谢谢 非常感谢,我在启动 grizzly 服务器时遇到了这个问题。当由 IDE 或 mvn:exec 启动时一切正常,但在使用具有依赖关系的 jar 时则不行。先生,你让我开心!【参考方案7】:我遇到了同样的问题。 事实上,请求并没有达到球衣注释的方法。 我通过添加注释解决了这个问题:@Consumes(MediaType.APPLICATION_FORM_URLENCODED) 注释 @Consumes("/") 不起作用!
@Path("/"+PropertiesHabilitation.KEY_EstNouvelleGH)
@POST
//@Consumes("*/*")
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
public void get__EstNouvelleGH( @Context HttpServletResponse response)
...
【讨论】:
【参考方案8】:我遇到了同样的问题,因为它给出了 error-415-unsupported-media-type,而我已经有了
@Consumes(MediaType.APPLICATION_JSON)
并在我的 restful web 服务中使用 Jersey 2.0+
请求标头Accept:application/json
Content-Type:application/json
我通过向我的项目添加以下依赖项解决了这个问题
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>2.25</version>
</dependency>
这会将以下 jars 添加到您的库中:
-
jersey-media-json-jackson-2.25.jar
jersey-entity-filtering-2.25.jar
jackson-module-jaxb-annotations-2.8.4.jar
jackson-jaxrs-json-provider-2.8.4.jar
jackson-jaxrs-base-2.8.4.jar
我希望它也能像对我一样对其他人有用。
【讨论】:
【参考方案9】:当您将 JSON 与 POST/PUT 等一起使用时,只需将 content-type 更改为 application/json...
【讨论】:
【参考方案10】:如果您尝试使用来自 google 的 ARC 应用并发布 XML
并收到此错误,请尝试将正文内容类型更改为 application/xml
。 Example here
【讨论】:
【参考方案11】:我在邮递员中遇到了同样的问题,我在标题部分选择了接受并将值提供为“application/json”。所以我取消选中并选择了 Content-Type 并将值提供为“application/json”。成功了!
【讨论】:
【参考方案12】:我在邮递员中使用时遇到了类似的问题。 对于标题部分下的 POST 请求,将这些添加为
键:值对
内容类型:应用程序/json 接受:应用程序/json
我希望它会起作用。
【讨论】:
【参考方案13】:如果没有一个解决方案有效并且您正在使用 JAXB,那么您需要使用 @XmlRootElement
注释您的类以避免 415 unsupported media type
【讨论】:
以上是关于错误 415 不支持的媒体类型:如果是 JSON,则 POST 未达到 REST,但如果是 XML,则可以的主要内容,如果未能解决你的问题,请参考以下文章
无法通过 CORS 将 JSON 发布到 ASPNET Core(415 - 不支持的媒体类型)
Spring,Angular.js 415 不支持的媒体类型错误
StatusCode: 415, ReasonPhrase: '不支持的媒体类型'