[JAVA] Un mémo sobrement accro à la demande de multipart / form-data

multipart/form-data L'autre jour, j'ai implémenté le traitement de la communication en utilisant HttpURLConnection de Java. Parmi eux, j'ai fait une partie qui peut être envoyée universellement au format multipart / form-data, mais pour une raison quelconque, elle n'est pas reconnue comme une demande de multipart / form-data quel que soit le nombre de fois qu'elle communique, et cela prend un temps considérable pour le résoudre. Je l'ai dépensé.

La cause est très ridicule, y a-t-il quelqu'un d'autre qui en soit accro? C'était comme ça, mais j'aimerais l'écrire sous forme de mémorandum.

Au fait, quand je l'ai écrit pour la première fois, c'était la cause. imageのコピー2.jpg

Corps de la requête pour multipart / form-data

Le général est comme ça. Le contenu assemblé dans le format suivant est mis sur le corps et communiqué.

multipart/form-corps de données


--[Corde de délimitation]
Content-Disposition: form-data; name="[Nom de forme]"

<<Contenu du formulaire>>
--[Corde de délimitation]
Content-Disposition: form-data; name="[Nom de forme]"; filename="[nom de fichier]"
Content-Type: text/plain

<<Contenu du fichier>>
--[Corde de délimitation]
・
・
・
Continue autant que tu envoies
・
・
・
--[Corde de délimitation]--

Écrivez le Content-Type de l'en-tête de la demande après multipart / form-data et la chaîne Boundary après le Content-Type. Le code de saut de ligne doit être CRLF.

Pour une raison quelconque, il n'est pas reconnu ...

En regardant le corps de la demande envoyée, il n'y a aucun signe de malentendu par rapport au format ci-dessus, et il ne fait aucun doute que la spécification de limite de Content-Type dans l'en-tête de la demande est correcte. Hmm?

Cause

Si vous communiquez depuis Postman au format de données de formulaire et comparez-le avec une demande qui est normalement reconnue,

multipart/form-corps de données


--[Corde de délimitation]

Le premier "-" manquait. .. Au début, je n'étais pas très familier avec le mécanisme de multipart / form-data, donc je l'ai fait en me référant aux sites sur le net, mais sur divers sites en tant que chaînes de caractères Boundary "-------- chaînes de caractères aléatoires" Parce que c'était une spécification comme, j'en ai appris et j'ai spécifié la chaîne de caractères avec "--------" au début, et il y avait un manque de reconnaissance qu'un "-" séparé était nécessaire au début. C'était parce qu'il était difficile de confirmer s'il avait effectivement été supprimé. (C'est une histoire pour lire correctement RFC.)

Au fait, le dernier délimiteur doit avoir un "-" derrière! (Rappel)

Leçon

La croyance est effrayante.

Écrivez-le pour que personne ne soit coincé avec un contenu similaire. (Y a-t-il une telle personne?)

Au fait

À propos, les sites suivants sont recommandés lors du test de la communication HTTP. Communication facile car il existe des points de terminaison qui renvoient des informations sur les demandes envoyées par GET ou POST sous la forme de JSON, des réponses binaires et divers autres points de terminaison sont disponibles. Vous pouvez également tester la communication assez fermement à partir de la confirmation du contenu.

Si vous ne le connaissez pas, veuillez l'utiliser. Faire des progrès. httpBin: https://httpbin.org/

Recommended Posts

Un mémo sobrement accro à la demande de multipart / form-data
[Circle CI] J'étais accro au test automatique de Circle CI (rails + mysql) [Memo]
Une histoire à laquelle j'étais accro à deux reprises avec le paramètre de démarrage automatique de Tomcat 8 sur CentOS 8
J'étais accro au record du modèle associé
Notez que j'étais accro au traitement par lots avec Spring Boot
Notez que j'étais accro aux paramètres du projet Android d'IntelliJ IDEA
J'étais accro au réglage de laradock + VSCode + xdebug
Un mémo du programme que vous pouvez réaliser que la probabilité de lancer des dés est d'environ 1/6
Un mémo qui conteneurise l'application de chat simple de Node.js + socket.io
À propos de la question pour laquelle j'étais accro à l'utilisation de hashmap
J'étais accro au paramètre API version min23 de registerTorchCallback
J'étais accro à la méthode du rouleau
J'étais accro au test Spring-Batch
Un mémo lorsque vous souhaitez effacer la partie horaire de l'agenda
Une histoire à laquelle j'étais accro lors du test de l'API à l'aide de MockMVC
J'étais accro à un simple test de Jedis (bibliothèque Java-> Redis)
Enregistré parce que j'étais accro à l'entrée standard de la classe Scanner
L'histoire de rendre possible la construction d'un projet qui a été construit par Maven avec Ant
Une histoire accro à EntityNotFoundException de getOne de JpaRepository
Faire une marge à gauche du TextField
Définir l'heure de LocalDateTime à une heure spécifique
J'étais un peu accro à la comparaison S3 Checksum, alors prenez note.
Une histoire que les personnes qui ont fait iOS solidement peuvent être accro à la mise en œuvre de Listener lors du passage à Android
[Solution] Un mémo que j'ai eu du mal car le format de sinatra-validation a changé.
La partie à laquelle j'étais accro dans "Introduction à Ajax dans les applications Web Java" de NetBeans
Une histoire à laquelle j'étais accro lors de l'obtention d'une clé qui a été automatiquement essayée sur MyBatis
J'étais accro à NoSuchMethodError dans Cloud Endpoints
J'étais accro à getXxxx de ResultSet car c'est un type primitif (Java)
Accro au Webpacker fourni en standard avec Rails 6
Mémo pour écrire silencieusement la source qui semble utilisable et le résultat de la compilation execution-java
Une histoire dans laquelle j'étais accro à la conversion de type implicite d'ActiveRecord lors du test unitaire
[Rails] Comment enregistrer temporairement l'URL de demande d'un utilisateur qui n'est pas connecté et revenir à cette URL après la connexion
Ce à quoi j'étais accro lors de l'introduction de la bibliothèque JNI
J'étais accro à la mise à jour de la déclaration dans MyBatis
Causes techniques et contre-mesures pour les points auxquels j'étais accro avec l'application Android et Kotlin (2. Traitement lié à la fonction caméra d'Android *)
Une histoire à laquelle j'étais accro avec toString () d'Interface qui était proxy avec JdkDynamicAopProxy
[Ruby] Comment récupérer le contenu du double hachage
Ce à quoi j'étais accro avec l'API REST Redmine
Un programme qui compte le nombre de mots dans une liste
[jsoup] Comment obtenir la totalité de la documentation
L'histoire à laquelle j'étais accro lors de la création de STS
Une collection de modèles dont vous voulez être conscient pour ne pas compliquer le code
[Controller] Je veux récupérer la valeur numérique d'une colonne spécifique de la base de données (mon mémo)
Un mémo étonnamment difficile même s'il semblait facile d'échanger entre deux Entités
J'ai créé une action GitHub qui facilite la compréhension du résultat de l'exécution de RSpec
[POST passé] Je publierai une partie du mémo réponse quand j'étais mentor de TECH :: CAMP
[Circle CI] Une histoire à laquelle j'étais accro chez Start Building
Essayez d'imiter l'idée d'un tableau à deux dimensions avec un tableau à une dimension
Mécanisme de conversion vers une langue que le navigateur peut reconnaître
Je veux comprendre le flux des paramètres de demande de traitement Spring
L'histoire de Collectors.groupingBy que je veux garder pour la postérité
Une note quand j'étais accro à la conversion d'Ubuntu sur WSL1 en WSL2