2017-02-06 4 views
0

У меня есть java-клиент, который отправляет объект JSON на сервер (служба REST). Код работает отлично. Мой текущий сервер возвращает «RESPONSE», но я хочу изменить свой код, чтобы вернуть строку с сервера на клиент (что-то вроде «передача была в порядке») - в дополнение к отправке объекта с клиента на сервер. Это код, у меня естьПолучение строки от сервера Java до клиента

Сервер:

@Path("/w") 
public class JSONRESTService { 
@POST 
@Path("/JSONService") 
@Consumes(MediaType.APPLICATION_JSON) 
public Response JSONREST(InputStream incomingData) { 
    StringBuilder JSONBuilder = new StringBuilder(); 
    try { 
     BufferedReader in = new BufferedReader(new InputStreamReader(incomingData)); 
     String line = null; 
     while ((line = in.readLine()) != null) { 
      JSONBuilder.append(line); 
     } 
    } catch (Exception e) { 
     System.out.println("Error Parsing: - "); 
    } 
    System.out.println("Data Received: " + JSONBuilder.toString()); 

    // return HTTP response 200 in case of success 
    return Response.status(200).entity(JSONBuilder.toString()).build(); 
} 
} 

Клиент:

public class JSONRESTServiceClient { 
public static void main(String[] args) { 
    String string = ""; 
    try { 

     JSONObject jsonObject = new JSONObject("string"); 

     // Step2: Now pass JSON File Data to REST Service 
     try { 
      URL url = new URL("http://localhost:8080/w/JSONService"); 
      URLConnection connection = url.openConnection(); 
      connection.setDoOutput(true); 
      connection.setRequestProperty("Content-Type", "application/json"); 
      connection.setConnectTimeout(5000); 
      connection.setReadTimeout(5000); 
      OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream()); 
      out.write(jsonObject.toString()); 
      out.close(); 

      BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); 

      while (in.readLine() != null) { 
      } 
      System.out.println("\nJSON REST Service Invoked Successfully.."); 
      in.close(); 
     } catch (Exception e) { 
      System.out.println("\nError while calling JSON REST Service"); 
      System.out.println(e); 
     } 

     br.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 
} 

Так что для того, чтобы вернуть строку с сервера на Client- я изменил первый метод в сервер, чтобы вернуть строку, , и я добавил это моему клиенту:

BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); 
StringBuffer sb = new StringBuffer(""); 
String line=""; 
while (in.readLine() != null) { 
       sb.append(line); 
       break; 
      } 
    System.out.println("message from server: " + sb.toString()); 
    in.close(); 

Но моя строка пуста. Что я делаю неправильно? Как мне изменить свой сервер/клиент, чтобы получить простую строку обратно или даже объект? Спасибо.

+0

Что такое "соединение" в последнем списке? –

+0

Это то же самое соединение, которое я открыл на клиенте (я просто добавил этот раздел к клиенту). – SHAI

ответ

1

Ваш код (пример):

package com.javacodegeeks.enterprise.rest.javaneturlclient; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.OutputStream; 
import java.net.HttpURLConnection; 
import java.net.MalformedURLException; 
import java.net.URL; 

public class JavaNetURLRESTFulClient { 

    private static final String targetURL = "http://localhost:8080/w/JSONService"; 

    public static void main(String[] args) { 

     try { 

      URL targetUrl = new URL(targetURL); 

      HttpURLConnection httpConnection = (HttpURLConnection) targetUrl.openConnection(); 
      httpConnection.setDoOutput(true); 
      httpConnection.setRequestMethod("POST"); 
      httpConnection.setRequestProperty("Content-Type", "application/json"); 

      String input = "{\"id\":1,\"firstName\":\"Liam\",\"age\":22,\"lastName\":\"Marco\"}"; 

      OutputStream outputStream = httpConnection.getOutputStream(); 
      outputStream.write(input.getBytes()); 
      outputStream.flush(); 

      if (httpConnection.getResponseCode() != 200) { 
       throw new RuntimeException("Failed : HTTP error code : " 
        + httpConnection.getResponseCode()); 
      } 

      BufferedReader responseBuffer = new BufferedReader(new InputStreamReader(
        (httpConnection.getInputStream()))); 

      String output; 
      System.out.println("Output from Server:\n"); 
      while ((output = responseBuffer.readLine()) != null) { 
       System.out.println(output); 
      } 

      httpConnection.disconnect(); 

      } catch (MalformedURLException e) { 

      e.printStackTrace(); 

      } catch (IOException e) { 

      e.printStackTrace(); 

     } 

     }  
    } 
+0

Эй, спасибо за этот пример, он похож на то, что я сделал, но это не сработало. Мне также нужны как входные, так и выходные потоки на моем клиенте. Так что до сих пор неясно, нужно ли мне новое соединение? (один для выходного потока и один для входного потока?) – SHAI

+0

@SHAI Я заменил этот пример. Я думаю, вам нужно одно соединение. Надеюсь, это сработает. –

+0

Спасибо! Я нашел свою проблему, и ваш код помог - это мой цикл while в моем клиенте while (in.readLine()! = Null). Мне нужно было написать - while (line = in.readLine()! = Null). Мне нужно было только изменить эту строку, да и одно соединение. – SHAI