Okhttp loggin interceptor en varias partes

Estoy intentando cargar una imagen usando okHTTP multi parte en un servidor. El servidor no acepta mi solicitud. Mi problema es que no puedo ver las partes de mi parte múltiple en el interceptor de registro, así que no puedo depurar. Aquí está el código que utilizo y el gato de log reulting y la carga útil deseada. Cualquier ayuda es apreciada.

RequestBody requestBody = new MultipartBody.Builder() .setType(MultipartBody.FORM) .addFormDataPart("uploaded_file", filename, RequestBody.create(MEDIA_TYPE_PNG, sourceFile)) .addFormDataPart("flowChunkNumber", "1") .addFormDataPart("flowCurrentChunkSize", String.valueOf(sourceFile.getTotalSpace())) .addFormDataPart("flowChunkSize", "1048576") .addFormDataPart("flowIdentifier", "4731-images1jpeg") .addFormDataPart("flowFilename", "images (1).jpeg") .addFormDataPart("flowFilename", "images (1).jpeg") .addFormDataPart("flowRelativePath", "images (1).jpeg") .addFormDataPart("flowTotalChunks", "1") .build(); Request request = new Request.Builder() .addHeader("cookie", ******* ) .url(URL_UPLOAD_IMAGE) .post(requestBody) .build(); HttpLoggingInterceptor logInterceptor = new HttpLoggingInterceptor(); logInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY); OkHttpClient client = new OkHttpClient .Builder() .addNetworkInterceptor(logInterceptor) .build(); Response response = client.newCall(request).execute(); 

Y esto es lo que veo en el gato de tronco cuando uso un interceptor

D / OkHttp: -> POST https://www.appido.ir/api/profile/avatar http / 1.1

D / OkHttp: Tipo de contenido: multipart / form-data; Frontera = a8028055-3a30-4942-916b-af56935e8b32

D / OkHttp: Content-Length: 14097 D / OkHttp: cookie: ************************
Dominio = .appido.ir; Expires = Tue, 23-Aug-2016 13:31:11 GMT; Camino = /

D / OkHttp: Anfitrión: www.appido.ir

D / OkHttp: Conexión: Keep-Alive

D / OkHttp: Aceptar-Codificación: gzip

D / OkHttp: User-Agent: okhttp / 3.4.1

D / OkHttp: h gTRC lumi 07-25 07: 47: 49.163 7776-8509 / com.androidbuts.uploadimage D / OkHttp: | meas 07-25 07: 47: 49.163 7776-8509 / com.androidbuts.uploadimage D / OkHttp: $ bkpt 07-25 07:47: 49.163 7776-8509 / com.androidbuts.uploadimage D / OkHttp: rXYZ

Y este gibberish continúa por muchas líneas

D / OkHttp: -> END POST (cuerpo de 14097 bytes)

¿Cómo puedo ver un gato de registro significativo? Quiero acihieve esto:

—— WebKitFormBoundaryJDdhM3Si8enJZABA Contenido-Disposición: formulario-datos; Name = "flowChunkNumber"

1 —— WebKitFormBoundaryJDdhM3Si8enJZABA Contenido-Disposición: formulario-datos; Name = "flowChunkSize"

1048576 —— WebKitFormBoundaryJDdhM3Si8enJZABA Content-Disposition: form-data; Name = "flowCurrentChunkSize"

23016 —— WebKitFormBoundaryJDdhM3Si8enJZABA Contenido-Disposición: formulario-datos; Name = "flowTotalSize"

23016 —— WebKitFormBoundaryJDdhM3Si8enJZABA Contenido-Disposición: formulario-datos; Name = "flowIdentifier"

23016-60x60music2_smalljpg —— WebKitFormBoundaryJDdhM3Si8enJZABA Contenido-Disposición: formulario-datos; Name = "flowFilename"

60x60music2_small.jpg —— WebKitFormBoundaryJDdhM3Si8enJZABA Contenido-Disposición: formulario-datos; Nombre = "flowRelativePath"

60x60music2_small.jpg —— WebKitFormBoundaryJDdhM3Si8enJZABA Contenido-Disposición: formulario-datos; Name = "flowTotalChunks"

1 —— WebKitFormBoundaryJDdhM3Si8enJZABA Contenido-Disposición: formulario-datos; Nombre = "archivo"; Filename = "blob" Tipo de contenido: application / octet-stream

—— WebKitFormBoundaryJDdhM3Si8enJZABA–

La forma de ver el contenido de una subida de Multipart desde Okttp y Retrofit es usar Stetho, por Facebook, y agregar StethoInterceptor al registrador Okhttp

https://github.com/facebook/stetho

Coloca las solicitudes de red de la aplicación de Android en el inspector de cromo de tu máquina de dev.

Parece ser un error en el interceptor de registro.

Pude resolver este problema comprar la depuración del interceptor de registro. El problema es que el cuerpo para multipartes es demasiado grande y el itercepter no puede mostrar un cuerpo tan grande de una vez. Necesita ser impreso línea por línea. Aquí está la versión modificada en intercepter de registro que trabaja con parte múltiple en okhttp 3.4.1:

 final class HttpLoggingInterceptor2 implements Interceptor { private static final Charset UTF8 = Charset.forName("UTF-8"); public enum Level { /** * No logs. */ NONE, /** * Logs request and response lines. * <p/> * <p>Example: * <pre>{@code * --> POST /greeting http/1.1 (3-byte body) * * <-- 200 OK (22ms, 6-byte body) * }</pre> */ BASIC, /** * Logs request and response lines and their respective headers. * <p/> * <p>Example: * <pre>{@code * --> POST /greeting http/1.1 * Host: example.com * Content-Type: plain/text * Content-Length: 3 * --> END POST * * <-- 200 OK (22ms) * Content-Type: plain/text * Content-Length: 6 * <-- END HTTP * }</pre> */ HEADERS, /** * Logs request and response lines and their respective headers and bodies (if present). * <p/> * <p>Example: * <pre>{@code * --> POST /greeting http/1.1 * Host: example.com * Content-Type: plain/text * Content-Length: 3 * * Hi? * --> END POST * * <-- 200 OK (22ms) * Content-Type: plain/text * Content-Length: 6 * * Hello! * <-- END HTTP * }</pre> */ BODY } public interface Logger { void log(String message); /** * A {@link Logger} defaults output appropriate for the current platform. */ Logger DEFAULT = new Logger() { @Override public void log(String message) { Platform.get().log(INFO, message, null); } }; } public HttpLoggingInterceptor2() { this(Logger.DEFAULT); } public HttpLoggingInterceptor2(Logger logger) { this.logger = logger; } private final Logger logger; private volatile Level level = Level.NONE; /** * Change the level at which this interceptor logs. */ public HttpLoggingInterceptor2 setLevel(Level level) { if (level == null) throw new NullPointerException("level == null. Use Level.NONE instead."); this.level = level; return this; } public Level getLevel() { return level; } @Override public Response intercept(Chain chain) throws IOException { Level level = this.level; Request request = chain.request(); if (level == Level.NONE) { return chain.proceed(request); } boolean logBody = level == Level.BODY; boolean logHeaders = logBody || level == Level.HEADERS; RequestBody requestBody = request.body(); boolean hasRequestBody = requestBody != null; Connection connection = chain.connection(); Protocol protocol = connection != null ? connection.protocol() : Protocol.HTTP_1_1; String requestStartMessage = "--> " + request.method() + ' ' + request.url() + ' ' + protocol; if (!logHeaders && hasRequestBody) { requestStartMessage += " (" + requestBody.contentLength() + "-byte body)"; } logger.log(requestStartMessage); if (logHeaders) { if (hasRequestBody) { // Request body headers are only present when installed as a network interceptor. Force // them to be included (when available) so there values are known. if (requestBody.contentType() != null) { logger.log("Content-Type: " + requestBody.contentType()); } if (requestBody.contentLength() != -1) { logger.log("Content-Length: " + requestBody.contentLength()); } } Headers headers = request.headers(); for (int i = 0, count = headers.size(); i < count; i++) { String name = headers.name(i); // Skip headers from the request body as they are explicitly logged above. if (!"Content-Type".equalsIgnoreCase(name) && !"Content-Length".equalsIgnoreCase(name)) { logger.log(name + ": " + headers.value(i)); } } if (!logBody || !hasRequestBody) { logger.log("--> END " + request.method()); } else if (bodyEncoded(request.headers())) { logger.log("--> END " + request.method() + " (encoded body omitted)"); } else { Buffer buffer = new Buffer(); requestBody.writeTo(buffer); Charset charset = Charset.forName("UTF8");// UTF8; MediaType contentType = requestBody.contentType(); if (contentType != null) { charset = contentType.charset(charset); } if (isPlaintext(buffer)) { String string = buffer.clone().readString(charset); String[] strings = string.split("\\r?\\n"); for (String subStr : strings) { logger.log(subStr); } logger.log("--> END " + request.method() + " (" + requestBody.contentLength() + "-byte body)"); } else { logger.log("--> END " + request.method() + " (binary " + requestBody.contentLength() + "-byte body omitted)"); } } } long startNs = System.nanoTime(); Response response; try { response = chain.proceed(request); } catch (Exception e) { logger.log("<-- HTTP FAILED: " + e); throw e; } long tookMs = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startNs); ResponseBody responseBody = response.body(); long contentLength = responseBody.contentLength(); String bodySize = contentLength != -1 ? contentLength + "-byte" : "unknown-length"; logger.log("<-- " + response.code() + ' ' + response.message() + ' ' + response.request().url() + " (" + tookMs + "ms" + (!logHeaders ? ", " + bodySize + " body" : "") + ')'); if (logHeaders) { Headers headers = response.headers(); for (int i = 0, count = headers.size(); i < count; i++) { logger.log(headers.name(i) + ": " + headers.value(i)); } if (!logBody || !HttpHeaders.hasBody(response)) { logger.log("<-- END HTTP"); } else if (bodyEncoded(response.headers())) { logger.log("<-- END HTTP (encoded body omitted)"); } else { BufferedSource source = responseBody.source(); source.request(Long.MAX_VALUE); // Buffer the entire body. Buffer buffer = source.buffer(); Charset charset = UTF8; MediaType contentType = responseBody.contentType(); if (contentType != null) { try { charset = contentType.charset(UTF8); } catch (UnsupportedCharsetException e) { logger.log(""); logger.log("Couldn't decode the response body; charset is likely malformed."); logger.log("<-- END HTTP"); return response; } } if (!isPlaintext(buffer)) { logger.log(""); logger.log("<-- END HTTP (binary " + buffer.size() + "-byte body omitted)"); return response; } if (contentLength != 0) { logger.log(""); logger.log(buffer.clone().readString(charset)); } logger.log("<-- END HTTP (" + buffer.size() + "-byte body)"); } } return response; } /** * Returns true if the body in question probably contains human readable text. Uses a small sample * of code points to detect unicode control characters commonly used in binary file signatures. */ static boolean isPlaintext(Buffer buffer) { try { Buffer prefix = new Buffer(); long byteCount = buffer.size() < 64 ? buffer.size() : 64; buffer.copyTo(prefix, 0, byteCount); for (int i = 0; i < 16; i++) { if (prefix.exhausted()) { break; } int codePoint = prefix.readUtf8CodePoint(); if (Character.isISOControl(codePoint) && !Character.isWhitespace(codePoint)) { return false; } } return true; } catch (EOFException e) { return false; // Truncated UTF-8 sequence. } } private boolean bodyEncoded(Headers headers) { String contentEncoding = headers.get("Content-Encoding"); return contentEncoding != null && !contentEncoding.equalsIgnoreCase("identity"); } 

}

  • ¿Qué está causando HTTP FALLA: java.net.SocketException: Socket cerrado?
  • El resorte de solicitud de varias partes no enlaza datos de archivo
  • El fallo de conexión de Retrofit devuelve RetrofitError.response como null
  • ¿Cómo hacer que OKHTTP envíe una solicitud sin un cuerpo de solicitud?
  • Android okHttp addFormDataPart dinámicamente para múltiples imágenes
  • Android OkHttp cómo manejar ETag
  • Cómo resolver java.lang.AssertionError al crear OkHttpClient en mockito?
  • HTTPS con Retrofit y OkHttp Handshake falló
  • Android OkHttp InputStream java.IOException.closed
  • Progreso de descarga con RxJava, OkHttp y Okio en Android
  • ¿Android usa OkHttp internamente?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.