【问题标题】:Java: Passing multiple parameters to a methodJava:将多个参数传递给方法
【发布时间】:2016-10-04 00:44:40
【问题描述】:

将多个参数传递给方法然后将这些参数放入有效负载的正确方法是什么?

该方法应该向服务器发送一个带有有效负载的 HTTP 请求(并从它接收响应),这工作得很好:

public static JSONObject myMethod(String parameterOne, JSONArray parameterTwo, String parameterThree, long parameterFour) {

    ...

    HttpPost request = new HttpPost(url);
    request.addHeader("Content-Type", "application/json");

    JSONObject payload = new JSONObject();
    payload.put("parameterOne", parameterOne);
    payload.put("parameterTwo", parameterTwo);
    payload.put("parameterThree", parameterThree);
    payload.put("parameterFour", parameterFour);

    request.setEntity(new StringEntity(payload.toString()));

    ...

但是,我相信应该有另一种更有效(和美观)的方式来执行此操作。

【问题讨论】:

  • 您认为它存在什么更高效/更美观?

标签: java json http http-post


【解决方案1】:

这实际上取决于您需要方法的可重用性。如果您只想使用这组 4 个参数发送请求,那可能是您能得到的最简洁的方法。如果您希望发送任意 JSON 数据,您可能希望在方法之外构造 JSONObject,并将其作为单个参数传入。

如果您正在寻找小的语法优势,您可能需要查看 google 的 Guava 和 Gson 库。他们会让你稍微浓缩一下:

public void callingMethod() {
    Map<String, Object> params = ImmutableMap.of(
        "param1Name", param1Value,
        "param2Name", param2Value,
    );
    makeRequest(params);
}

public void makeRequest(Map<String, Object> params) {
    HttpPost request = new HttpPost(url);
    request.addHeader("Content-Type", "application/json");
    request.setEntity(new Gson().toJson(params)));
}

或者,如果您正在与整个 REST API 交互,您可以使用 Jersey 之类的库将其建模为 Java 类,然后创建一个代理来隐藏您正在发出 HTTP 请求的事实:

@Path("/v1")
public interface RestApi {
    @POST
    @Path("/objects/{objectId}/create")
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    ResponseObject createObject(@PathParam("objectId") Integer objectId, RequestObject body);
}

public class RequestObject {
    public final String param1;
    public final List<Integer> param2;

    public RequestObject(String param1, List<Integer> param2) {
        this.param1 = param1;
        this.param2 = param2;
   }
}

public class ResponseObject {
    // etc
}

public static void main() {
    String url = "https://api.example.com";
    Client client = ClientBuilder.newBuilder().build().target(url);
    RestApi restApi = WebResourceFactory.newResource(RestApi.class, clientBuilder);
    ResponseObject response = restApi.createObject(12, new RequestObject("param1", ImmutableList.of(1,2,3));
}

呃,我想这里的重点是Java并不是特别简洁。

【讨论】:

    【解决方案2】:

    你可以的

    public static JSONObject myMethod(String ... params) {
        //access each one like so:
        //params[0]
        //params[1]
    }
    //...
    myMethod("here", "are", "multiple", "parameters");
    

    但是,这将参数限制为全部为字符串,您可以发送 JSONObject 作为参数开始并跳过方法内的序列化。

    【讨论】:

      猜你喜欢
      • 2013-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多