2016-05-12 71 views
1

我试图从java发出一个POST请求到一个现有的RESTful服务,以获得json响应并将其存储在一个字符串中。如何向Java提供json RESTful服务的发布请求?

让我们假设RESTful服务链接如下:

https://myStore.com/REST-API/ 

这是一种与产品商店,你要搜索的项目。为了使搜索你也必须发送Request Body这样:

{ 
    "searchProduct": "Football" 
} 

为了让那个帖子我实现了在Java中,下面的方法:

public String getJsonResponse(String searchProduct) throws Exception { 

    String url = "https://myStore.com/REST-API/"; 
    String requestBody = "{\"searchProduct\": \"" + searchProduct + "\"}"; 

    URL obj = new URL(url); 

    HttpsURLConnection connection = (HttpsURLConnection) obj 
      .openConnection(); 

    connection.setDoOutput(true); 
    connection.setRequestMethod("POST"); 
    connection.setRequestProperty("Content-Type", "application/json"); 

    OutputStream outputStream = connection.getOutputStream(); // <-- I get an exception. 

    outputStream.write(requestBody.getBytes()); 
    outputStream.flush(); 

    BufferedReader in = new BufferedReader(new InputStreamReader(
      connection.getInputStream())); 
    String inputLine; 
    StringBuffer response = new StringBuffer(); 

    while ((inputLine = in.readLine()) != null) { 
     response.append(inputLine); 
    } 

    in.close(); 

    return response.toString(); 

} 

例外的是以下内容:

Exception in thread "main" java.net.UnknownHostException: myStore.com 
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:184) 
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172) 
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) 
at java.net.Socket.connect(Socket.java:589) 
at sun.security.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:668) 
at sun.security.ssl.BaseSSLSocketImpl.connect(BaseSSLSocketImpl.java:173) 
at sun.net.NetworkClient.doConnect(NetworkClient.java:180) 
at sun.net.www.http.HttpClient.openServer(HttpClient.java:432) 
at sun.net.www.http.HttpClient.openServer(HttpClient.java:527) 
at sun.net.www.protocol.https.HttpsClient.<init>(HttpsClient.java:264) 
at sun.net.www.protocol.https.HttpsClient.New(HttpsClient.java:367) 
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(AbstractDelegateHttpsURLConnection.java:191) 
at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1105) 
at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:999) 
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:177) 
at sun.net.www.protocol.http.HttpURLConnection.getOutputStream0(HttpURLConnection.java:1283) 
at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1258) 
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:250) 
at com.stavros.restfulServices.Requester.getJsonRespondingResults(Requester.java:70) 
at com.stavros.restfulServices.MyMain.main(MyMain.java:11) 

我不知道为什么我收到此异常,但如果你有一个想法,或者你也面临着同样的问题,我将不胜感激,如果你张贴提示离子或答案。

+1

是您的网络电缆插入? – Lee

+0

什么在'at com.stavros.restfulServices.Requester.getJsonRespondingResults(Requester.java:70)'?这是造成异常的原因。提供的代码包含名称略有不同的方法。 – sanastasiadis

+0

“UnknownHostException”能否访问您正在尝试发布的网址 – AnupamBhusari

回答

0

https://myStore.com/REST-API/

不存在;请检查该网址。

+0

我其实没有给你真实的URL,这就是为什么我写了“让我们假设RESTful服务网址是”。我用小提琴尝试了实际的Url,我得到了应有的答案。我想对Java代码有一些帮助。 RESTful服务有效。我只需要调用它并获得响应。 – Origamer7

0

这个例外意味着你的主机是未知的。请确保您的网址存在。

java.net.UnknownHostException: myStore.com 
+0

我其实并没有给你真实的URL,这就是为什么我写了“让我们假设RESTful服务网址是”。我用小提琴尝试了实际的Url,我得到了应有的答案。我想对Java代码有一些帮助。 RESTful服务有效。我只需要调用它并获得响应。 – Origamer7

2

我尝试运行代码,并得到这个错误

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> 
<html><head><title>301 Moved Permanently</title></head> 
<body><h1>Moved Permanently</h1> 
<p>The document has moved <a href="http://www.myStore.com/REST-API/">here</a>.</p> 
<hr><address>Apache/2.4.7 (Ubuntu) Server at mystore.com Port 80</address></body></html> 

意味着你需要重新验证web服务的URL可能被移动到其他主机。 https://en.wikipedia.org/wiki/HTTP_301

import java.io.BufferedReader; 
import java.io.InputStreamReader; 
import java.io.OutputStream; 
import java.net.URL; 

import javax.net.ssl.HttpsURLConnection; 



public class Test { 

    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     try { 
     System.out.println(getJsonResponse("Football")); 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    } 

    public static String getJsonResponse(String searchProduct) throws Exception { 

     String url = "https://myStore.com/REST-API/"; 
     String requestBody = "{\"searchProduct\": \"" + searchProduct + "\"}"; 

     URL obj = new URL(url); 

     HttpsURLConnection connection = (HttpsURLConnection) obj 
       .openConnection(); 

     connection.setDoOutput(true); 
     connection.setRequestMethod("POST"); 
     connection.setRequestProperty("Content-Type", "application/json"); 

     OutputStream outputStream = connection.getOutputStream(); // <-- I get an exception. 

     outputStream.write(requestBody.getBytes()); 
     outputStream.flush(); 

     BufferedReader in = new BufferedReader(new InputStreamReader(
       connection.getInputStream())); 
     String inputLine; 
     StringBuffer response = new StringBuffer(); 

     while ((inputLine = in.readLine()) != null) { 
      response.append(inputLine); 
     } 

     in.close(); 

     return response.toString(); 

    } 
} 
+0

干得好,我想这个帖子包含了答案。当试图发送一个请求到'http:// mystore.com'时,他们的web服务器试图将你重定向到'http:// www.mystore.com'。因此,要解决您的问题,请在您正在使用的网址中添加“www”部分。 – sanastasiadis

+0

我其实没有给你真实的URL,这就是为什么我写了“让我们假设RESTful服务网址是”。我用小提琴尝试了实际的Url,我得到了应有的答案。我想对Java代码有一些帮助。 RESTful服务有效。我只需要调用它并获得响应。 – Origamer7

+1

@StavrosVrakas您是否在提琴手中打开了“关注重定向”选项?请尝试关闭,并报告结果。 – sanastasiadis

0

请看看here,然后提供一个默认HostNameVerifier像:

public class DummyHostnameVerifier implements HostnameVerifier { 
    @Override 
    public boolean verify(String s, SSLSession sslSession) { 
     return true; 
    } 
} 

reference here

然后,你需要拨打:

HttpsURLConnection.setDefaultHostnameVerifier(new DummyHostnameVerifier()); 
相关问题