java - 如何在 Android 中调用 `POST` RESTfull 方法?

标签 java android rest http post

我用 Java 开发了一个网络服务。下面是它的一个方法。

@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 中调用,但我不确定该怎么做。我知道如何在 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 中使用 Jersey 不感兴趣,因为它在 Android 环境中确实有不好的评论。

最佳答案

Android 提供了一种方法来做你想做的事,但这不是一种高效的方法,我喜欢使用 retrofit 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();

现在创建一个接口(interface)来封装您的其余方法,如下所示

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

将您的端点接口(interface)与您的改造实例相关联。

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

关于java - 如何在 Android 中调用 `POST` RESTfull 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37678254/

相关文章:

java - 如何在java REST中使用引号

java - 当 GridView 中的文本为 null 或为空时如何显示图像,反之亦然?

java - 在 Java EE 6 中注释 REST Web 服务

java - Swing 对 JList 的 MVC 实现有问题吗?

java - 使用java创建、编辑和删除pdf文件

java - Spring Data Rest - 在 _embedded 中包含嵌套资源

android - 无法取消注册phonestatelistener

java - Activity onCreate 是否会在其中调用 fragment 的每个 NewInstance?

java - 将项目迁移到gradle之后,空指针异常

swift - 发布图像对象 Clarifai Rest api swift