2016-05-12 10 views
1

jsonレスポンスを取得してStringに格納するために、javaから既存のRESTfulサービスにPOSTリクエストを送信しようとしています。Javaからjson RESTfulサービスへのポストリクエストを作成するにはどうすればいいですか?

はのは、RESTfulなサービスのURLは次のようであることを仮定しよう:

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

製品と店舗の一種であり、あなたがアイテムを検索したいです。私はJavaで次のメソッドを実装しているポストを作るために

{ 
    "searchProduct": "Football" 
} 

:あなたのようなもRequest Bodyを送信する必要が検索を行うために

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

'com.stavros.restfulServices.Requester.getJsonRespondingResults(Requester.java:70)'には何がありますか?これにより例外が発生しています。提供されるコードには、わずかに異なる名前のメソッドが含まれています。 – sanastasiadis

+0

"UnknownHostException"投稿しようとしているURLにアクセスできます – AnupamBhusari

答えて

0

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

存在しません。そのURLを確認してください。

+0

実際にあなたに実際のURLを送信しなかったので、「RESTfulなサービスURLがあると仮定しましょう」と書いています。私はフィドラーで実際のURLを試して、私が想定したとおりの応答を得る。私はJavaコードについていくつかの助けをしたいと思います。 RESTfulサービスが機能します。私はそれを呼び出して応答を得るだ​​けです。 – Origamer7

0

この例外は、ホストが不明であることを意味します。あなたのURLが存在することを確認してください。

java.net.UnknownHostException: myStore.com 
+0

実際にあなたに実際のURLを送信しなかったので、「RESTfulなサービスURLがあると仮定しよう」と書いたのです。私はフィドラーで実際の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'にリクエストを送信しようとすると、彼らのウェブサーバーはあなたを' http:// www.mystore.com'にリダイレクトしようとしています。したがって、あなたの問題を解決するには、あなたが使用しているURLに 'www'部分を追加してください。 – sanastasiadis

+0

実際にあなたに実際のURLを送信しなかったので、「私はRESTfulなサービスURLがあると仮定しよう」と書いたのです。私はフィドラーで実際のURLを試して、私が想定したとおりの応答を得る。私はJavaコードについていくつかの助けをしたいと思います。 RESTfulサービスが機能します。私はそれを呼び出して応答を得るだ​​けです。 – Origamer7

+1

@StavrosVrakas Fiddlerで「リダイレクトに従う」オプションがオンになっていますか?オフにしてみて、結果を報告してください。 – 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()); 
関連する問題