Ich versuche, mit OkHttp einige JSON-Daten abzurufen, und kann nicht herausfinden, warum, wenn ich versuche, das zu protokollieren, response.body().toString()
was ich bekommeResults:﹕ 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);
Ich weiß nicht, was ich hier falsch mache. Wie bekomme ich die Antwortzeichenfolge?
string
Antworten:
Nur für den Fall, dass jemand auf die seltsame Sache stößt wie ich. Ich führe meinen Code während der Entwicklung im Debug-Modus und anscheinend seit OKHttp 2.4 aus
Beim Debuggen wird der Inspektor "hinter den Kulissen" angerufen, und der Körper ist immer leer. Siehe: https://square.github.io/okhttp/3.x/okhttp/okhttp3/ResponseBody.html
quelle
.string()
ohne einen Antwortkörper zu verbrauchen?Sie haben die
.string()
Funktion, um die Antwort auszudruckenSystem.out.println()
. Aber endlich benutztLog.i()
du.toString()
.Verwenden Sie also bitte
.string()
den Antworttext, um die Antwort Ihrer Anfrage auszudrucken und zu erhalten, z.HINWEIS:
.toString()
: Dies gibt Ihr Objekt im Zeichenfolgenformat zurück..string()
: Dies gibt Ihre Antwort zurück.Ich denke, das löst dein Problem ... Richtig.
quelle
Das
response.body,.string()
kann nur einmal konsumiert werden. Bitte verwenden Sie wie folgt:quelle
Es folgt mein modifizierter CurlInterceptor. Überprüfen Sie das Ende der Intercept-Funktion, an der ich das Response-Objekt neu erstelle, nachdem ich die alte Response verbraucht habe.
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){} } }
quelle
versuchen Sie es zum Beispiel so zu ändern:
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; }
quelle
Da eine Antwort
OutOfMemoryError
bei großen Dateien möglicherweise zu einer Antwort führen kann , können Sie stattdessen den Body mit der Anzahl der Bytes "spähen" und diestring()
Methode aufrufen .Beachten Sie, dass dies den Körper verbraucht.
response.peekBody(500).string());
quelle
Erstellen Sie das Antwortobjekt neu, nachdem Sie die Zeichenfolge verbraucht haben
val responseBodyString = response.body () !!. string ()
response = response.newBuilder () .body (ResponseBody.create (responseBody? .contentType (), responseBodyString.toByteArray ()) .build ()
quelle