![](/img/trans.png)
[英]Not able to send JSON object to Ajax from Jersey REST web service
[英]Not able to invoke an @DELETE web service in REST/JERSEY
我正在使用Jersey框架(JAX-RS实现)来构建RESTful Web服务。
我无法使用@DELETE REST方法,因为当我尝试调用它时会抛出异常。以下@DELETE方法用于删除Employee:
@Path("/employees")
public class EmpResource {
@DELETE
@Consumes(MediaType.APPLICATION_JSON)
public Response deleteEmployee(JAXBElement<String> r) throws ClassNotFoundException, SQLException {
String name = r.getValue();
String response = DAOaccess.deleteEmp(name);
return Response.noContent().build();
}
我正在使用以下代码块来调用服务:
Client client = Client.create();
WebResource webResource = client.resource("http://localhost:8080/RestApp/sample/employees");
String input = "{\"name\":\"John\"}";
ClientResponse response = webResource.type(MediaType.APPLICATION_JSON).delete(ClientResponse.class,input);
当我运行客户端时,它将引发以下异常:
Exception in thread "main" com.sun.jersey.api.client.ClientHandlerException: java.net.ProtocolException: HTTP method DELETE doesn't support output
at com.sun.jersey.client.urlconnection.URLConnectionClientHandler.handle(URLConnectionClientHandler.java:151)
at com.sun.jersey.api.client.Client.handle(Client.java:648)
at com.sun.jersey.api.client.WebResource.handle(WebResource.java:680)
at com.sun.jersey.api.client.WebResource.access$200(WebResource.java:74)
at com.sun.jersey.api.client.WebResource$Builder.delete(WebResource.java:599)
如果有人可以指导我解决问题,那就太好了吗?
HTTPUrlConnection类的实现是Java的错误:
http://bugs.sun.com/view_bug.do?bug_id=7157360
应该在java 8 .....中解决。
同时,实际上,要将json发送到REST服务,您必须发送路径参数(如@Micer所说),或进行自己的HttpUrlConnection设置request方法为POST并使用“ X-HTTP_method-Override”覆盖说您要执行以下删除操作:
public static void remove(String dflowname) throws IOException, ParseException {
String jsonResponse = "";
URL url = new URL(deleteuri);
HttpURLConnection connection = null;
connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("POST");
// We have to override the post method so we can send data
connection.setRequestProperty("X-HTTP-Method-Override", "DELETE");
connection.setDoOutput(true);
// Send request
OutputStreamWriter wr = new OutputStreamWriter(
connection.getOutputStream());
wr.write(dflowname);
wr.flush();
// Get Response
BufferedReader rd = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String line;
while ((line = rd.readLine()) != null) {
jsonResponse = jsonResponse.concat(line);
}
wr.close();
rd.close();
JSONParser parser = new JSONParser();
JSONObject obj = (JSONObject) parser.parse(jsonResponse);
System.out.println(obj.get("status").toString());
}
来源: https : //groups.google.com/a/openflowhub.org/forum/#!msg / floodlight-dev / imm_8drWOwU / Uu4h_u3H6HcJ
对我来说,它有助于从客户端的delete()方法中删除输入参数
ClientResponse response = webResource.type(MediaType.APPLICATION_JSON).delete(ClientResponse.class);
并通过@pathParam发送:
public String delete(@PathParam("input") String input){...}
带有有效负载的删除在Jersey客户端2.xx中工作正常
下面的客户端代码示例。
public CalculateResult unoverrideSubscription(String partyId, String serviceCode) {
CalculateResult svc = r.path("/party-subscriptions").path(partyId)
.path(serviceCode)
.path("price")
.request(MediaType.APPLICATION_JSON).delete(CalculateResult.class);
return svc;// toGenericResponse(sr);
}
这似乎是由于HttpURLConnection类的Java 1.7实现中的错误( https://bugs.openjdk.java.net/browse/JDK-7157360 )引起的。 我尝试使用JDK1.8,它就像一个魅力。
花了一些时间来尝试确定当前使用WebLogic 12和Sun / JRocket 1.6可以解决的问题以及不能解决的问题。
错误“ ProtocolException:HTTP方法DELETE不支持输出”似乎有点误导。 该错误不是由RS返回输出而是由尝试传递要在删除请求中处理的对象引起的。
通过@QueryParams传递键/标识符时,您可以收到一个对象...
@DELETE
@Path("deleteThis")
public Response deleteThis(@QueryParam("objectId") String objectId)
using
ClientResponse response = webResource.path("deleteThis").queryParam("objectId", "1").delete(ClientResponse.class);
或通过@PathParams ...
@DELETE
@Path("deleteThis/{objectId}")
public ReturnedObject deleteThis(@PathParam("objectId") int objectId)
using
ReturnedObject myReturnedObject = webResource.path("deleteThis").path("1").delete(ReturnedObject.class);
当您传递要用作参数的对象时,会产生此错误
@DELETE
@Path("deleteThis")
public Response deleteRuleSettingTest(ArgumentObject myObject)
using
ArgumentObject myArgumentObject = ...
ClientResponse response = webResource.path("deleteThis").delete(ClientResponse.class, myArgumentObject);
另外。 查看了sun.net.www.protocol.http.HttpURLConnection类的源代码。 当方法不是PUT或POST时,仅在协议为'http'时,才产生此错误。 启用并将客户端指向容器上的安全端口,最后一个示例(导致异常的示例)成功运行。 让我怀疑这是否真的像某些人所建议的那样是一个Java错误。
您必须为所有类型的请求创建一个过滤器
<filter>
<filter-name>CorsFilter</filter-name>
<filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
<init-param>
<param-name>cors.allowed.origins</param-name>
<param-value>*</param-value>
</init-param>
<init-param>
<param-name>cors.allowed.methods</param-name>
<param-value>GET,POST,HEAD,OPTIONS,PUT,DELETE</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CorsFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
如错误所示,
HTTP方法DELETE不支持输出
因此,您必须将方法的签名更改为
public Response deleteEmployee(...)
在该方法中,不返回String
但例如
return Response.noContent().build();
@DELETE
方法的返回类型应该为void
。 你不能退回任何东西。 成功后,响应状态可以是200或204
我通常像void一样使用DELETE:
@DELETE
@Consumes({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
@Path("/")
public void deleteSomeBean(@QueryParam("id") String id) throws Exception
并在客户中:
webResource.path(SERVICE_PATH).queryParam("id", someBean.getId()).delete();gith
就像这里: TemplateRestService
我确实遇到过Java 1.7的相同问题。它在JDK1.8中有效
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.