在休息Web服务问题

时间:2015-06-29 11:28:05

标签: ajax json post jersey jax-rs

我想将一个JSON对象从我的页面发布到Rest WS。但是当我通过jQuery ajax调用作为输出发布json时,我得到一个HTML页面,其中包含" HTTP状态405 - 方法不允许"我从Rest Web Service发送的JSON的instate。请参阅以下代码段。

我正在使用jquery 1.11.3版本。

http://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js

jQuery Ajax Call:

 $.ajax({
        url: "http://localhost:8080/MyWebService/api/myService/jsonpost",
        method: "POST",
        data: jsonObj,
        dataType: 'application/json',
        contentType: "application/json",
         success: function(result){
              alert(result);
         },
         error(){
             console.log('Error');
         }
    });

请注意我的其他网络服务正在我的本地tomcat中运行。

请查找我的Rest Web Service POST代码。

@POST
@Path("/jsonpost")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public String crunchifyJsonPostREST(SampleVO input) throws JSONException{
    SampleVO sampleVO = input;
    return new Gson().toJson(sampleVO);
}

VO:

public class SampleVO {

private String name;

/**
 * @return the name
 */

@XmlElement
public String getName() {
    return name;
}

/**
 * @param name the name to set
 */
public void setName(String name) {
    this.name = name;
}

}

我的Maven依赖关系是:

    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-server</artifactId>
        <version>1.8</version>
    </dependency>

    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-json</artifactId>
        <version>1.8</version>
    </dependency>

Firebug详细信息:

请找到我的ajax请求标题。

enter image description here

请找到我的ajax响应和响应HTML。  enter image description here enter image description here

需要您的帮助来解决此问题。

谢谢你的到来。

解决方案:

经过大量的谷歌搜索,我找到了一些解决方案。现在我正在使用HTTP-Proxy-Servlet。

我用我的html页面创建了一个带有ajax调用的java web应用程序,从我的ajax调用我调用的是同一个域的URL。请参考我的ajax电话。

 $.ajax({
        url: "rest/api/crunchifyService/jsonpost",
        method: "POST",
        data: JSON.stringify(jsonObj),
        dataType: 'json',
        contentType: "application/json",
         success: function(result,status,jqXHR ){
              //Do something
         },
         error(jqXHR, textStatus, errorThrown){
             //Do something
         }
    }); 

现在我使用org.mitre.dsmiley.httpproxy.ProxyServlet完成了相同的域调用映射。请参考我的网站xml。

<servlet>
    <servlet-name>proxy</servlet-name>
    <servlet-class>org.mitre.dsmiley.httpproxy.ProxyServlet</servlet-class>
    <init-param>
        <param-name>targetUri</param-name>
        <param-value><!-- Cross domain URL goes here --></param-value>
    </init-param>
    <init-param>
        <param-name>log</param-name>
        <param-value>true</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>proxy</servlet-name>
    <url-pattern>/rest/*</url-pattern>
</servlet-mapping>

现在我的ajax正在调用此代理Servlet,它正在重定向到CROS目标Rest Web服务。

请参阅以下网址,您将获得更多详细信息。

https://github.com/mitre/HTTP-Proxy-Servlet

3 个答案:

答案 0 :(得分:1)

数据类型应为dataType: 'json'

如果您使用的是contentType: "application/json",,那么您应该对数据进行字符串化。

data:JSON.stringify(jsonObj), 

答案 1 :(得分:1)

经过大量的谷歌搜索,我找到了一些解决方案。现在我正在使用HTTP-Proxy-Servlet。

我用我的html页面创建了一个带有ajax调用的java web应用程序,从我的ajax调用我调用的是同一个域的URL。请参考我的ajax电话。

{{1}}

现在我使用org.mitre.dsmiley.httpproxy.ProxyServlet完成了相同的域调用映射。请参考我的网站xml。

{{1}}

现在我的ajax正在调用此代理Servlet,它正在重定向到CROS目标Rest Web服务。

请参阅以下网址,您将获得更多详细信息。

https://github.com/mitre/HTTP-Proxy-Servlet

答案 2 :(得分:0)

尝试使用type&amp; ajax的contentType设置:

type:'POST',
contentType: 'application/json',

示例:

function loadDoc(){
  var num = '{"empid": 45,"name": "gaurav","salary":566.55}';
  $.ajax({
    url: 'http://localhost:9029/addS',
    method: 'POST',
    type:'POST',
    contentType: 'application/json',
    success: function(response){
      console.log("response::::"+response);
      $("#output").text(response);
    },
    error: function( jqXHR,textStatus, errorThrown){
      console.log("Error askdjk");
      console.log(jqXHR);
      console.log(textStatus);
      console.log(errorThrown);
    }
  });   
}