[Notas de la red informática 7] Capa de aplicación (4) Método HTTP para enviar datos a través del tipo de contenido

1. Content-Type: application/x-www-form-urlencodedIndica el método de envío del formulario en texto plano.

El formato es el siguiente:

POST /users HTTP/1.1 
Host: api.github.com
Content-Type: application/x-www-form-urlencoded 
Content-Length: 27

name=zhangsan&gender=male 

Código de actualización correspondiente:

@FormUrlEncoded
@POST("/users")
Call<User> addUser(@Field("name") String name, @Field("gender") String gender);

También es posible utilizar este tipo para solicitudes GET.

2. Content-Type: multipart/form-data;boundary=[分隔符]Método de envío de formularios de texto múltiple que contienen archivos

El formato es el siguiente:

POST /home/upload.html HTTP/1.1
Aceptar: texto/sin formato, */*
Aceptar-Idioma: zh-cn
Host: 192.168.24.56
Tipo de contenido:multipart/form-data;límite=------- ----------------------7db372eb000e2
Longitud del contenido: 3693
Conexión: Keep-Alive

----------------- --------------7db372eb000e2
Disposición de contenido: datos de formulario; nombre = "nombre de usuario"

admin
----------------------------------7db372eb000e2
Disposición de contenido: datos-formulario;nombre="archivo"; filename=" kn.jpg”
Tipo de contenido: image/jpeg
(aquí se omiten los datos binarios del archivo JPEG...)

------------------------ -------- --7db372eb000e2–

Tenga en cuenta esta línea: Según RFC1867, el campo es obligatorioContent-Type: multipart/form-data; boundary=---------------------------7db372eb000e2 de esta manera . Incluye una bandera llamada , que puede ser una cadena ingresada a voluntad. También es necesaria para el contenido específico que sigue . Se utiliza para identificar el comienzo de un fragmento de contenido .Content-Type:multipart/form-databoundary

Longitud del contenido: 3693 , donde 3693 es la longitud total del archivo que se cargará.

La parte de fuente verde son los datos que deben cargarse, que pueden ser texto, imágenes, etc. El contenido de los datos debe estar precedido por campos de descripción como Content-Disposition , Content-Type y Content-Transfer-Encoding .

La última parte morada es el final del acuerdo.

---------------------------7db372eb000e2Es un separador que separa varios archivos y elementos de formulario. donde b372eb000e2es un número generado sobre la marcha para garantizar que el delimitador completo no aparezca en el contenido del archivo o elemento del formulario.

Cada parte del Formulario está separada por un delimitador. --Los dos caracteres " " deben agregarse antes del delimitador --{boundary}para que el protocolo http lo considere como el delimitador del Formulario. Para indicar el final, agregue " --" después del delimitador correcto para indicar el final (es decir --{boundary}--).

El frente ---------------------------7des un logotipo exclusivo de IE, y Mozila es---------------------------71

Cada dato separado puede usar Content-Type para indicar el tipo de los siguientes datos. Puede consultar rfc1341, por ejemplo: Contect-Type:image/jpegindica que los siguientes datos son jpegdatos de archivo.

Código de actualización correspondiente:

@Multipart
@POST("/users")
Call<User> addUser(@Part("name") RequestBody name, @Part("avatar") RequestBody avatar);
...
RequestBody namePart = RequestBody.create(MediaType.parse("text/plain"), nameStr);
RequestBody avatarPart = RequestBody.create(MediaType.parse("image/jpeg"), avatarFile);
api.addUser(namePart, avatarPart); 

3. Content-Type: application/jsonIndica enviar datos en formato json.

El formato es el siguiente:

POST /users HTTP/1.1
Host: app.test.com
Content-Type: application/json; charset=utf-8 
Content-Length: 38

{
    
    "name":"zhangsan","gender":"male"} 

Código de actualización correspondiente:

@POST("/users")
Call<User> addUser(@Body("user") User user); 
...
// 需要使用 JSON 相关的 Converter
api.addUser(user); 

JSON se devuelve en la respuesta:

HTTP/1.1 200 OK
Content-type: application/json; charset=utf-8 
Content-length: 234

[{
    
    "login":"mojombo","id":1,"node_id":"MDQ6VXN1 cjE=",
"avatar_url":"https://avatars0.githubuse rcontent.com/u/1?v=4",
"gravat":....}]

4. Content-Type: image/jpegIndica enviar contenido de archivo binario y cargar un solo archivo.

El formato es el siguiente:

POST /user/1/avatar HTTP/1.1 
Host: app.test.com
Content-Type: image/jpeg 
Content-Length: 1575 

JFIFHH9......

Código de actualización correspondiente:

@POST("users/{id}/avatar")
Call<User> updateAvatar(@Path("id") String id, @Body RequestBody avatar);
...
RequestBody avatarBody = RequestBody.create(MediaType.parse("image/jpeg"), avatarFile);
api.updateAvatar(id, avatarBody)

El contenido binario se devuelve en la respuesta:

HTTP/1.1 200 OK
Content-type: image/jpeg 
Content-length: 1575 

JFIFHH9......

Adquisición de tipo de tipo de contenido/tipo MIME

Los tipos de datos corporales comunes incluyen principalmente las siguientes cuatro categorías:

  • text: Datos legibles en formato de texto, como text/htmlhipertexto, text/plaintexto sin formato, text/csshoja de estilo, etc.

  • image: Archivos de imagen, como image/gif, image/jpeg, image/pngetc.

  • audio/video: Datos de audio y vídeo, como audio/mpeg, video/mp4etc.

  • application: El formato no es fijo y puede ser texto o binario. Debe ser interpretado por la aplicación de la capa superior. Los más comunes incluyen application/json, application/javascript, application/pdfetc.

  • Si no sabe de qué tipo son los datos, utilice application/octet-streamdatos binarios opacos.

Para obtener una tabla de comparación de tipos completa, consulte la lista de tipos MIME mantenida por IANA: https://www.iana.org/assignments/media-types/media-types.xhtml

De hecho, no necesitamos recordarlos: en el lenguaje de desarrollo utilizado, existen muchos métodos integrados en el sistema o bibliotecas de terceros que pueden generar directamente el tipo MIME de acuerdo con el archivo.

En Android, existen dos métodos integrados para obtener el tipo MIME de un archivo.

  1. MimeTypeMapConsíguelo a través de
  2. ContentResolverConsíguelo a través de

A continuación se muestra un código de muestra que se puede utilizar MimeTypeMappara Fileobtener el tipo MIME de un objeto:

import android.webkit.MimeTypeMap;

public String getMimeType(File file) {
    
    
    String mimeType = null;
    String extension = MimeTypeMap.getFileExtensionFromUrl(file.getAbsolutePath());

    if (extension != null) {
    
    
        mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension.toLowerCase());
    }

    return mimeType;
}

Este método se utiliza primero MimeTypeMap.getFileExtensionFromUrl()para obtener la extensión del archivo y luego MimeTypeMap.getSingleton().getMimeTypeFromExtension()para obtener el tipo MIME correspondiente. Finalmente devuelve la cadena de tipo MIME encontrada.

Tenga en cuenta que este método se basa en la extensión del archivo para determinar el tipo MIME, por lo que la extensión del archivo debe configurarse correctamente. Si el archivo no tiene extensión o tiene una extensión incorrecta, es posible que este método no identifique correctamente el tipo MIME.

Pero a veces lo que obtenemos durante el desarrollo es un objeto Content Uri (por ejemplo) consultado desde la base de datos de medios del sistema content://media/external/images/media/94. No tiene una extensión de archivo. ¿Cómo obtener su tipo MIME?

Puede considerar usarlo en este momento ContentResolver. El siguiente es ContentResolverel código de referencia para obtener Content Uri:

import android.content.ContentResolver;
import android.content.Context;
import android.net.Uri;

public String getMimeTypeFromContentUri(Context context, Uri contentUri) {
    
    
    ContentResolver contentResolver = context.getContentResolver();
    String mimeType = contentResolver.getType(contentUri);
    return mimeType;
}

Otra situación es que tenemos un Filetipo Uri(que filecomienza con, como file://xxx/xx) que se puede obtener a través del siguiente código de referencia:

String fileExtension = MimeTypeMap.getFileExtensionFromUrl(fileUri.toString());
mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(fileExtension.toLowerCase());

El siguiente código de referencia se puede aplicar tanto a situaciones de Uri de contenido como de Uri de archivo:

public String getMimeType(Context context, Uri uri) {
    
    
    String mimeType = null;
    if (ContentResolver.SCHEME_CONTENT.equals(uri.getScheme())) {
    
    
        ContentResolver cr = context.getContentResolver();
        mimeType = cr.getType(uri);
    } else {
    
    
        String fileExtension = MimeTypeMap.getFileExtensionFromUrl(uri.toString());
        mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(fileExtension.toLowerCase());
    }
    return mimeType;
}

Supongo que te gusta

Origin blog.csdn.net/lyabc123456/article/details/133324240
Recomendado
Clasificación