Okhttp3 - 如何在 Okhttp3 客户端中定义特定请求
Okhttp3 - How to define a specific Request in an Okhttp3 Client
我有一个递归方法,它使用 okhttp3
向端点发出连续的分页请求,直到某个属性不再存在。我的测试 运行 模拟了流程中的最后一次调用,但我在完成 2 步迭代时遇到了问题。
如何在 newCall() 方法中定义一个特定的 ohkttp3.Request,使其不会每次都抛出 NullPointer?我的code/test在下面供参考
错误: java.lang.NullPointerException
递归方法
public JSONArray recursiveMethod(JSONArray array, String authCode, String requestUrl) {
String nextPageAtt = "newPage";
String newPage = null;
Request request = new Request.Builder()
.url(requestUrl)
.get()
.addHeader("Content-Type", "application/json")
.addHeader("Authorization", authCode)
.build();
try {
//Problem child
okhttp3.Response response = client.newCall(request).execute();
if (response.code() == SUCCESS_CODE && response.body() != null) {
//Add JSON data to array
//if "newPage" attribute in response, set it here
//only present when page != last page
} else {
}
}
//"newPage" attribute won't be present on the last page of data"
if (newPage != null) {
recursiveMethod(array, authCode, baseUrl + newPage);
}
return array;
}
测试方法
@Test
void recursiveMethodNonewPage() throws IOException {
JSONArray emptyArray = new JSONArray();
final Response successResponse = new Response.Builder()
.request(new Request.Builder().url("https://localhost:8080/getData").build()) //"newPage" not there (last call)
.protocol(Protocol.HTTP_1_1)
.code(SUCCESS_CODE).message("").body(
ResponseBody.create(
MediaType.parse("application/json"),
"/////JSON/////"
))
.build();
when(remoteCall.execute()).thenReturn(successResponse);
//this works when I pass "any()" but a java.lang.NullPointerException is thrown when I enter a specific Request
when(mockClient.newCall(any())).thenReturn(remoteCall);
//******Issue******
//Need to pass a specific request on in order to simulate multiple recursive iterations
/*Request request = new Request.Builder()
.url(https://localhost:8080/getData)
.get()
.addHeader("Content-Type", "application/json")
.addHeader("Authorization", authCode)
.build();*/
//Throws Null
//when(mockClient.newCall(request))).thenReturn(remoteCall);
JSONArray newArray = getDataUtil.recursiveMethod(emptyArray, authCodeSuccess, "https://localhost:8080/getData");
assertEquals(4, newArray.length());
}
终于在这里找到了我的答案:
when( method-call ).thenReturn( value1, value2, value3 );
工作测试
@Test
void recursiveMethodNonewPage() throws IOException {
JSONArray emptyArray = new JSONArray();
final Response pageOne = new Response.Builder()
.request(new Request.Builder().url("https://localhost:8080/getData").build())
.protocol(Protocol.HTTP_1_1)
.code(SUCCESS_CODE).message("").body(
ResponseBody.create(
MediaType.parse("application/json"),
"/////JSON/////"
))
.build();
final Response pageTwo = new Response.Builder()
.request(new Request.Builder().url("https://localhost:8080/getData").build())
.protocol(Protocol.HTTP_1_1)
.code(SUCCESS_CODE).message("").body(
ResponseBody.create(
MediaType.parse("application/json"),
"/////JSON/////"
))
.build();
when(mockClient.newCall(any())).thenReturn(remoteCall);
when(remoteCall.execute()).thenReturn(pageOne, pageTwo);
JSONArray newArray = getDataUtil.recursiveMethod(emptyArray, authCodeSuccess, "https://localhost:8080/getData");
assertEquals(4, newArray.length());
}
我有一个递归方法,它使用 okhttp3
向端点发出连续的分页请求,直到某个属性不再存在。我的测试 运行 模拟了流程中的最后一次调用,但我在完成 2 步迭代时遇到了问题。
如何在 newCall() 方法中定义一个特定的 ohkttp3.Request,使其不会每次都抛出 NullPointer?我的code/test在下面供参考
错误: java.lang.NullPointerException
递归方法
public JSONArray recursiveMethod(JSONArray array, String authCode, String requestUrl) {
String nextPageAtt = "newPage";
String newPage = null;
Request request = new Request.Builder()
.url(requestUrl)
.get()
.addHeader("Content-Type", "application/json")
.addHeader("Authorization", authCode)
.build();
try {
//Problem child
okhttp3.Response response = client.newCall(request).execute();
if (response.code() == SUCCESS_CODE && response.body() != null) {
//Add JSON data to array
//if "newPage" attribute in response, set it here
//only present when page != last page
} else {
}
}
//"newPage" attribute won't be present on the last page of data"
if (newPage != null) {
recursiveMethod(array, authCode, baseUrl + newPage);
}
return array;
}
测试方法
@Test
void recursiveMethodNonewPage() throws IOException {
JSONArray emptyArray = new JSONArray();
final Response successResponse = new Response.Builder()
.request(new Request.Builder().url("https://localhost:8080/getData").build()) //"newPage" not there (last call)
.protocol(Protocol.HTTP_1_1)
.code(SUCCESS_CODE).message("").body(
ResponseBody.create(
MediaType.parse("application/json"),
"/////JSON/////"
))
.build();
when(remoteCall.execute()).thenReturn(successResponse);
//this works when I pass "any()" but a java.lang.NullPointerException is thrown when I enter a specific Request
when(mockClient.newCall(any())).thenReturn(remoteCall);
//******Issue******
//Need to pass a specific request on in order to simulate multiple recursive iterations
/*Request request = new Request.Builder()
.url(https://localhost:8080/getData)
.get()
.addHeader("Content-Type", "application/json")
.addHeader("Authorization", authCode)
.build();*/
//Throws Null
//when(mockClient.newCall(request))).thenReturn(remoteCall);
JSONArray newArray = getDataUtil.recursiveMethod(emptyArray, authCodeSuccess, "https://localhost:8080/getData");
assertEquals(4, newArray.length());
}
终于在这里找到了我的答案:
when( method-call ).thenReturn( value1, value2, value3 );
工作测试
@Test
void recursiveMethodNonewPage() throws IOException {
JSONArray emptyArray = new JSONArray();
final Response pageOne = new Response.Builder()
.request(new Request.Builder().url("https://localhost:8080/getData").build())
.protocol(Protocol.HTTP_1_1)
.code(SUCCESS_CODE).message("").body(
ResponseBody.create(
MediaType.parse("application/json"),
"/////JSON/////"
))
.build();
final Response pageTwo = new Response.Builder()
.request(new Request.Builder().url("https://localhost:8080/getData").build())
.protocol(Protocol.HTTP_1_1)
.code(SUCCESS_CODE).message("").body(
ResponseBody.create(
MediaType.parse("application/json"),
"/////JSON/////"
))
.build();
when(mockClient.newCall(any())).thenReturn(remoteCall);
when(remoteCall.execute()).thenReturn(pageOne, pageTwo);
JSONArray newArray = getDataUtil.recursiveMethod(emptyArray, authCodeSuccess, "https://localhost:8080/getData");
assertEquals(4, newArray.length());
}