OkHttp의 response.body.toString()이 문자열을 반환하도록 가져올 수 없습니다.
OkHttp를 사용하여 json 데이터를 가져오려고 하는데 로그인을 시도해도 이유를 알 수 없습니다.response.body().toString()
내가 얻는 것은Results:﹕ com.squareup.okhttp.Call$RealResponseBody@41c16aa8
try {
URL url = new URL(BaseUrl);
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url(url)
.header(/****/)
.build();
Call call = client.newCall(request);
Response response = call.execute();
**//for some reason this successfully prints out the response**
System.out.println("YEAH: " + response.body().string());
if(!response.isSuccessful()) {
Log.i("Response code", " " + response.code());
}
Log.i("Response code", response.code() + " ");
String results = response.body().toString();
Log.i("OkHTTP Results: ", results);
내가 여기서 뭘 잘못하고 있는지 모르겠어응답 문자열을 얻으려면 어떻게 해야 하나요?
사용할 수 있습니다..string()
응답을 인쇄하는 기능System.out.println()
하지만 결국엔Log.i()
사용하고 있다.toString()
.
그래서 꼭 사용해 주세요..string()
인쇄하여 다음과 같은 요청에 대한 응답을 얻을 수 있습니다.
response.body().string();
주의:
.toString()
: 개체를 문자열 형식으로 반환합니다..string()
: 응답이 반환됩니다.
이게 네 문제를 해결해 줄 것 같은데...맞다.
혹시나 누군가 나와 같은 이상한 일에 부딪힐까 봐.디버깅 모드에서 개발 중에 코드를 실행했는데 OKHttp 2.4 이후인 것 같습니다.
..응답 본문은 한 번만 소비할 수 있는 원샷 값입니다.
따라서 디버깅 시 인스펙터로부터의 "behind the seen" 콜이 존재하며 본문은 항상 비어 있습니다.참조: https://square.github.io/okhttp/3.x/okhttp/okhttp3/ResponseBody.html
그response.body.string()
한 번만 소비할 수 있습니다.아래와 같이 사용해 주세요.
String responseBodyString = response.body.string();
응용 프로그램에서 필요에 따라 responseBodyString을 사용합니다.
다음은 수정된 Curl Interceptor입니다.이전 응답을 사용한 후 응답 개체를 다시 만드는 가로채기 함수의 끝을 확인합니다.
var responseBodyString = responseBody?문자열()
응답 = 응답.newBuilder() .body ( ResponseBody . create ( responseBody )contentType(), responseBodyString.toByteArray() .build() .build() 。
class CurlInterceptor: Interceptor
{
var gson = GsonBuilder().setPrettyPrinting().create()
override fun intercept(chain: Interceptor.Chain): Response {
Timber.d(" **** ->>Request to server -> ****")
val request = chain.request()
var response = chain.proceed(request)
var curl = "curl -v -X ${request.method()}"
val headers = request.headers()
for ( i in 0..(headers.size() -1) ){
curl = "${curl} -H \"${headers.name(i)}: ${headers.value(i)}\""
}
val requestBody = request.body()
if (requestBody != null) {
val buffer = Buffer()
requestBody.writeTo(buffer)
var charset: Charset =
Charset.forName("UTF-8")
curl = "${curl} --data '${buffer.readString(charset).replace("\n", "\\n")}'"
}
Timber.d("$curl ${request.url()}")
Timber.d("response status code ${response.code()} message: ${response.message()}")
dumbHeaders(response)
var responseBody = response?.body()
if(responseBody != null )
{
var responseBodyString = responseBody?.string()
response = response.newBuilder()
.body(
ResponseBody.create(
responseBody?.contentType(),
responseBodyString.toByteArray()
)
)
.build()
responseBodyString = gson.toJson(responseBodyString)
Timber.d("response json -> \n $responseBodyString")
}
Timber.d(" **** << Response from server ****")
return response
}
fun dumbHeaders(response: Response) {
try {
if (response.headers() != null) {
for (headerName in response.headers().names()) {
for (headerValue in response.headers(headerName)) {
Timber.d("Header $headerName : $headerValue")
}
}
}
}
catch (ex: Exception){}
}
}
개체를 반환하는 .toString() 대신
String results = response.body().toString();
사용할 수 있습니다.
String results = response.body().string();
응답에 의해 잠재적으로 다음 메시지가 생성될 수 있습니다.OutOfMemoryError
큰 파일의 경우는, 대신에 본문에 바이트수를 붙여 콜 할 수 있습니다.string()
방법.
이 경우 차체가 소모됩니다.
response.peekBody(500).string());
예를 들어 다음과 같이 변경합니다.
protected String doInBackground(String... params) {
try {
JSONObject root = new JSONObject();
JSONObject data = new JSONObject();
data.put("type", type);
data.put("message", message);
data.put("title", title);
data.put("image_url", imageUrl);
data.put("uid",uid);
data.put("id", id);
data.put("message_id", messageId);
data.put("display_name", displayName);
root.put("data", data);
root.put("registration_ids", new JSONArray(receipts));
RequestBody body = RequestBody.create(JSON, root.toString());
Request request = new Request.Builder()
.url(URL)
.post(body)
.addHeader("Authorization", "key=" + serverKey)
.build();
Response response = mClient.newCall(request).execute();
String result = response.body().string();
Log.d(TAG, "Result: " + result);
return result;
} catch (Exception ex) {
Log.e(TAG,"Exception -> "+ex.getMessage());
}
return null;
}
문자열을 사용한 후 응답 개체 재생성
val responseBodyString = response.body()!문자열()
응답 = response.newBuilder() .body(ResponseBody.create(responseBody))contentType(), responseBodyString.toByteArray().build().
Call call = client.newCall(request);
return call.execute().body().string();
우리는 이것들로부터 답례로 응답을 얻을 수 있다.
Kotlin 프로그래머들 난 널 위해
response.body?.charStream()?.readText()?.let {
//Where it refers to Response string
callBack.onAPISuccess(it)
}
여기서는 .toString() 함수를 사용할 수 없습니다.또한 Kotlin에서는 .string() 함수를 사용할 수 없습니다.이 함수는 charStream()을 사용하여 해당 charStream을 readText()로 변환할 수 있지만 전달하기 전에 값 전체를 풀어야 합니다.하지만 그것은 결코 문제를 일으키지 않을 것이다.
자바에서는 이러한 charStream() 및 readText() 함수를 탐색하지 않았습니다만, 이 함수가 사용 가능한 경우 Java에서는 사용할 수 있습니다.이것은 java가 .string() 함수를 폐지하고 있다는 것을 알게 되었기 때문입니다.
언급URL : https://stackoverflow.com/questions/28300359/cant-get-okhttps-response-body-tostring-to-return-a-string
'source' 카테고리의 다른 글
MariaDb SQL 주입 (1) | 2022.09.25 |
---|---|
2개의 NULL 포인터를 감산하는 동작이 정의되어 있습니까? (1) | 2022.09.25 |
Java ThreadLocal 변수가 정적이어야 하는 이유 (1) | 2022.09.25 |
Maria에서 다중 마스터 복제 오류를 수정하는 방법DB (0) | 2022.09.18 |
PHP용 최적의 XML 파서 (0) | 2022.09.18 |