2016-06-07 2 views
2

Я разработал веб-сервис на Java. Ниже приводится его метод.Как вызвать методы POST RESTfull в Android?

@Path("/setup") 
public class SetupJSONService { 

    @POST 
    @Path("/insertSetup") 
    @Consumes(MediaType.APPLICATION_JSON) 
    public String insertSetup(SetupBean bean) 
    { 
     System.out.println("Printed"); 
     SetupInterface setupInterface = new SetupImpl(); 
     String insertSetup = setupInterface.insertSetup(bean); 
     return insertSetup; 
    } 
} 

Ниже, как я называю этот метод с использованием Java Jersey в моем компьютере.

Client client = ClientBuilder.newClient(); 
WebTarget target = client.target("http://localhost:8080/TestApp/rest/setup").path("/insertSetup"); 

SetupBean setupBean = new SetupBean(); 
setupBean.setIdPatient(1); 
setupBean.setCircleType(1); 

target.request(MediaType.APPLICATION_JSON_TYPE).post(Entity.entity(setupBean, MediaType.APPLICATION_JSON_TYPE)); 

Однако этот метод также следует вызывать в Android, но я не уверен, как это сделать. Я знаю, как делать GET звонки в андроид, как показано ниже.

public static String httpGet(String urlStr) throws IOException { 
    URL url = new URL(urlStr); 
    HttpURLConnection conn = 
     (HttpURLConnection) url.openConnection(); 

    if (conn.getResponseCode() != 200) { 
    throw new IOException(conn.getResponseMessage()); 
    } 

    // Buffer the result into a string 
    BufferedReader rd = new BufferedReader(
     new InputStreamReader(conn.getInputStream())); 
    StringBuilder sb = new StringBuilder(); 
    String line; 
    while ((line = rd.readLine()) != null) { 
    sb.append(line); 
    } 
    rd.close(); 

    conn.disconnect(); 
    return sb.toString(); 
} 

Но так как мой метод POST и так как принимать Java Bean и он возвращает String, как я могу справиться с этим в Android? Не интересует использование Джерси в андроиде, так как у него плохие комментарии в среде Android.

ответ

5

Android предлагает способ делать то, что вы хотите, но это не очень полезный способ, мне нравится использовать модификацию 2 для управления моей разработкой и написания лучшего кода.

Вот пример модифицированных 2, который может помочь вам =):

добавить к вашим зависимостям в build.gradle

dependencies { 
    compile 'com.google.code.gson:gson:2.6.2' 
    compile 'com.squareup.retrofit2:retrofit:2.0.2' 
    compile 'com.squareup.retrofit2:converter-gson:2.0.2' 
} 

Создать свой модифицированный строитель, который определяет преобразователь и базовый URL.

public static final String URL = "http://localhost:8080/TestApp/rest/"; 
Retrofit retrofit = new Retrofit.Builder() 
    .baseUrl(URL) 
    .addConverterFactory(GsonConverterFactory.create()) 
    .build(); 

Теперь создает интерфейс, который инкапсулирует ваши методы отдыха, как ниже

public interface YourEndpoints { 
    @POST("setup/insertSetup") 
    Call<ResponseBody> insertSetup(@Body SetupBean setupBean); 
} 

Associate конечных точки интерфейс с экземпляром модифицированного.

YourEndpoints request = retrofit.create(YourEndpoints.class); 

Call<ResponseBody> yourResult = request.insertSetup(YourSetupBeanObject); 
    yourResult.enqueue(new Callback<ResponseBody>() { 
     @Override 
     public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) { 
      //response.code() 
      //your string response response.body().string() 
     } 

     @Override 
     public void onFailure(Throwable t) { 
      //do what you have to do if it return a error 
     } 
    }); 

Ссылка на это ссылку для получения дополнительной информации:

http://square.github.io/retrofit/

https://github.com/codepath/android_guides/wiki/Consuming-APIs-with-Retrofit

+0

Спасибо за сообщение , Но почему это невозможно сделать с нормальными встроенными вещами? Этот путь кажется завершающим. –

+0

Добро пожаловать =), вы можете сделать это обычным способом! Я просто хочу указать более продуктивный и простой в использовании способ. –

+0

Спасибо. Любое руководство для нормального пути? Я думаю, что в Джерси также они внутренне конвертируют объект в JSON перед отправкой на сервер? –

2

That`s кода для нормального пути вы хотите

InputStream is = null; 
     OutputStream os = null; 
     HttpURLConnection con = null; 
     try { 
      //constants 
      URL url = new URL("http://localhost:8080/TestApp/rest/"); 
      //Map your object to JSONObject and convert it to a json string 
      String message = new JSONObject().toString(); 

      con = (HttpURLConnection) url.openConnection(); 
      con.setReadTimeout(1000); 
      con.setConnectTimeout(15000); 
      con.setRequestMethod("POST"); 
      con.setDoInput(true); 
      con.setDoOutput(true); 
      con.setFixedLengthStreamingMode(message.getBytes().length); 

      con.setRequestProperty("Content-Type", "application/json;charset=utf-8"); 

      //open 
      con.connect(); 

      //setup send 
      os = new BufferedOutputStream(con.getOutputStream()); 
      os.write(message.getBytes()); 
      //clean up 
      os.flush(); 

      //do somehting with response 
      is = con.getInputStream(); 
      String contentAsString = readData(is,len); 

      os.close(); 
      is.close(); 
      con.disconnect(); 
     } catch (Exception e){ 
      try { 
       os.close(); 
       is.close(); 
       con.disconnect(); 
      } catch (IOException e1) { 
       e1.printStackTrace(); 
      } 

     } 
+0

Спасибо. Я думаю, что Gson может преобразовать объект в json –

+0

Да, вы можете использовать Gson =) –

+0

Gson g = new Gson(); Строка json = g.toJson (YourObject); –