2016-01-25 73 views
2

對於基於REST的Web服務,我很新。我想打電話給小REST WS,我創建了看起來開始如下使用POST調用返回REST Web服務返回415

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; 
    } 

} 

每當我使用表單數據

http://localhost:8080/HackDataEngine/login/authenticate 
Content-Type application/json 
user admin 

password admin 

POSTMAN call screenshot

撥打郵政從Chrome中郵遞員一樣

我得到如下回應

<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> 

回答

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

嘗試使用其中一個,樣品只有MediaType.APPLICATION_JSON

對於年初REST服務,這是一個頂級教程: http://crunchify.com/how-to-build-restful-service-with-java-using-jax-rs-and-jersey/

+1

感謝您的快速反應。我嘗試了你的建議,但仍然看到相同的錯誤。我嘗試通過在調試中運行服務器。該控件沒有進入'authenticateUser'方法。所以我懷疑這個問題與** @ Consumes **和** @ FormParam **更相關。感謝您的REST啓動鏈接 – BondCode

+0

歡迎:) – ElMariachi25

1

您需要在郵差正確設置

在您的請求標籤中,按Headers並設置一個像這樣的新變量。

  • 的Content-Type - >應用/ JSON
+0

我這樣做,似乎沒有工作:( – BondCode

+0

更改您的消費聲明: - ** MediaType.APPLICATION_JSON **。@ @Consumes(MediaType。 MediaType.APPLICATION_JSON)' – kunpapa

+0

@BondCode另外,你是否嘗試發送JSON答案,而不是形式數據?我看到你的img(http://i.stack.imgur.com/IPn6h.png)。按下raw和寫下一個JSON: '{「user」:「administrator」,「password」:「admin」}' – kunpapa

0

謝謝大家對他們的快速反應...的JSON類型paremeter路過的作品。如果原來的做法已被調試我做的方法參數簽名下面的變化和它的工作

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

以前是

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