使用POST调用返回415来使用REST Web服务

时间:2016-01-25 16:19:43

标签: java web-services rest

我对基于REST的Web服务很陌生。我试图调用一个小的REST WS,我创建的开始看起来如下

    package webServices;

import java.net.UnknownHostException;

import javax.ws.rs.Consumes;
import javax.ws.rs.FormParam;
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.MediaType;

import org.json.JSONException;
import org.json.JSONObject;

import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.MongoClient;



@Path("/login")
public class LoginService {



    @Path("/isUp")
    @GET
    @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })

    public String checkServiceStatus(){

        return "up and running";

    }

    @Path("/authenticate")
    @POST
    @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN })
    @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
    public String authenticateUser(@FormParam("user") String user, @FormParam("password") String pwd){


        DB db;
        DBCollection coll;

        MongoClient mongoClient;
        String loginResponse="user does not exist";
        try {
            mongoClient = new MongoClient( "localhost" , 27017 );

            db = mongoClient.getDB( "Hackathon" );
            coll = db.getCollection("users");

            BasicDBObject filter = new BasicDBObject();
            filter.put("user", user);
            BasicDBObject selectField = new BasicDBObject();
            selectField.put("password", 1);
            selectField.put("_id", 0);

            DBCursor cursor = coll.find(filter, selectField);
            String jsonString = cursor.next().toString();
            JSONObject json = new JSONObject(jsonString);
            String password = json.getString(user);
            System.out.println("password "+password);

            if(password.equals(pwd)){
                loginResponse="success";
                System.out.println("success");
            }else{
                loginResponse="failure";
                System.out.println("failure");
            }


        } catch (UnknownHostException e) {

            e.printStackTrace();
        } catch (JSONException e) {

            e.printStackTrace();
        }


        return loginResponse;
    }   

}

每当我使用form-data

从Chrome邮递员调用POST服务时
http://localhost:8080/HackDataEngine/login/authenticate
Content-Type application/json
user admin

password admin

POSTMAN call screenshot

我得到以下回复

<html>
    <head>
        <title>Apache Tomcat/7.0.67 - Error report</title>
        <style>
            <!--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;}HR {color : #525D76;}-->
        </style>
    </head>
    <body>
        <h1>HTTP Status 415 - Unsupported Media Type</h1>
        <HR size="1" noshade="noshade">
            <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 size="1" noshade="noshade">
                <h3>Apache Tomcat/7.0.67</h3>
            </body>
        </html>

3 个答案:

答案 0 :(得分:1)

@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN })

尝试使用其中一个,仅限样本MediaType.APPLICATION_JSON

从Rest Service开始,这是一个顶级教程: http://crunchify.com/how-to-build-restful-service-with-java-using-jax-rs-and-jersey/

答案 1 :(得分:1)

您需要在Postman上正确设置标题

在您的请求标签上,按标题并设置一个新变量。

  • 内容类型 - &gt;的应用/ JSON

答案 2 :(得分:0)

感谢大家的快速回复...... JSON型传感器传递工作。如果必须调试原始方法,我在方法参数签名中进行了以下更改,并且它可以正常工作

public String authenticateUser(@FormParam("user") String user, @FormParam("password") String password)

以前是

public String authenticateUser(@FormParam("user") String user, @FormParam("password") String pwd)