将多个参数传递给方法然后将这些参数放入有效负载的正确方法是什么?
该方法应该向服务器发送带有效负载的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()));
...
但是,我相信应该有另一种更有效(和审美)的方式来执行此操作。
答案 0 :(得分: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并不是特别简洁。
答案 1 :(得分:0)
你可以做到
public static JSONObject myMethod(String ... params) {
//access each one like so:
//params[0]
//params[1]
}
//...
myMethod("here", "are", "multiple", "parameters");
然而,这会将参数限制为所有字符串,您可以将JSONObject作为参数发送,以开始并跳过方法中的序列化。