11/03/2022
Forstå HTTP 415: Når Serveren Afviser Dit Dataformat
Du har netop brugt timer på at perfektionere din hjemmeside, bygget en elegant HTML-formular og skrevet JavaScript for at sende dataene til en ekstern service, som f.eks. HubSpot. Du trykker på knappen, forventer en bekræftelse, men i stedet mødes du af en uforståelig fejlmeddelelse: "HTTP 415 Unsupported Media Type". Det er frustrerende, især når du er overbevist om, at alt er sat korrekt op. Men hvad betyder denne fejl egentlig, og hvordan kan du rette den? Denne artikel vil dykke ned i HTTP 415-fejlkoden, forklare dens årsager og give dig praktiske løsninger, så du kan få dine data sendt afsted uden problemer.

Hvad Betyder HTTP 415?
HTTP 415 Unsupported Media Type er en klientfejl, der indikerer, at serveren nægter at acceptere din anmodning. Årsagen er, at formatet på din anmodnings-payload (den data du sender) ikke understøttes af serveren. Dette kan skyldes flere faktorer, primært relateret til, hvordan du fortæller serveren, hvilken type data du sender, eller selve dataens format.
Ifølge MDN Web Docs (developer.mozilla.org) "indikerer klientfejlsresponskoden HTTP 415 Unsupported Media Type, at serveren nægter at acceptere anmodningen, fordi payload-formatet er i et ikke-understøttet format. Formatproblemet kan skyldes den angivne Content-Type eller Content-Encoding i anmodningen, eller som følge af direkte inspektion af dataene."
Med andre ord, serveren forstår simpelthen ikke den type information, du forsøger at sende den. Det er som at forsøge at tale et sprog, som modtageren ikke kender. Serveren har specifikke forventninger til, hvordan data skal struktureres og præsenteres, og når disse forventninger ikke opfyldes, returneres en 415-fejl.
Almindelige Årsager til HTTP 415 Fejl
Når du arbejder med webudvikling og API-kald, er der flere typiske grunde til, at du kan støde på en 415-fejl:
- Forkert Content-Type Header: Dette er den mest almindelige årsag. Hver HTTP-anmodning indeholder headers, som er metadata om anmodningen.
Content-Typeheaderen fortæller serveren, hvilket medieformat dataene i anmodningens body har (f.eks.application/json,application/x-www-form-urlencoded,multipart/form-data). Hvis denne header er forkert angivet, eller mangler, vil serveren muligvis ikke kunne fortolke dine data korrekt. - Forkert Dataformat: Selvom
Content-Typeheaderen er korrekt, kan selve dataene være formateret forkert. For eksempel, hvis du angiverContent-Type: application/json, men sender data i et andet format (f.eks. ren tekst eller et forkert JSON-format), vil du få en 415-fejl. - Manglende eller Forkert Content-Encoding: Nogle gange kan data blive komprimeret eller kodet (f.eks. med gzip). Hvis serveren forventer en bestemt kodning, men den mangler eller er forkert angivet i
Content-Encodingheaderen, kan det også udløse en 415-fejl. - API-specifikke Krav: Nogle API'er har meget specifikke krav til dataformatet, som måske ikke er umiddelbart indlysende. Det er altid en god idé at konsultere den relevante API-dokumentation.
Eksempel: HubSpot Formular og AJAX
Lad os se på det specifikke eksempel, du har givet, hvor du forsøger at sende data til en HubSpot-formular ved hjælp af AJAX. Du bruger jQuery's $.post() metode, hvilket er en almindelig måde at sende data på.
Her er din JavaScript-kode:
$(document).ready(function(){ $('#auraForm').submit(function (e, data) { console.clear(); e.preventDefault(); dataToHubspot(); }); }); function dataToHubspot() { var data = { 'fields': [ {'name': 'project_name', 'value': $("input[name='project_name']").val()}, {'name': 'fixture_type', 'value': $("input[name='fixture_type']").val()}, {'name': 'specifying_company', 'value': $("input[name='specifying_company']").val()}, {'name': 'project_location', 'value': $("input[name='project_location']").val()}, {'name': 'contact', 'value': $("input[name='contact']").val()}, {'name': 'quantity', 'value': $("input[name='quantity']").val()}, {'name': 'item_number', 'value': $("input[name='item_number']").val()}, {'name': 'email', 'value': $("input[name='email']").val()}, ], "legalConsentOptions": { "consent": { "consentToProcess": true, "text": "I agree to allow Evo-Lite to store and process my personal data." } }, 'skipValidation': true, }; $.post('https://api.hsforms.com/submissions/v3/integration/submit/4212798/928e4bbb-bc49-4c67-9a2e-f2472a10b9ae', data) .then(function (response) { console.log(response); }); } Fejlen du ser er:
jquery-1.7.1.js:4 POST https://api.hsforms.com/submissions/v3/integration/submit/4212798/928e4bbb-bc49-4c67-9a2e-f2472a10b9ae 415 (send @ jquery-1.7.1.js:4) Problemet her ligger sandsynligvis i, hvordan $.post() sender dataene som standard. Som standard sender jQuery data som application/x-www-form-urlencoded, medmindre du eksplicit angiver andet eller sender data som en streng. HubSpot's API forventer typisk JSON-data til denne type integration.
Løsning: Brug af $.ajax() med JSON
For at løse dette problem skal du eksplicit fortælle jQuery, at du sender JSON-data, og specificere den korrekte Content-Type header. Den bedste måde at gøre dette på er ved at bruge $.ajax() metoden, som giver dig mere kontrol over anmodningen.
Her er den rettede JavaScript-kode:
$(document).ready(function(){ $('#auraForm').submit(function (e) { console.clear(); e.preventDefault(); dataToHubspot(); }); }); function dataToHubspot() { var formData = { 'fields': [ {'name': 'project_name', 'value': $("input[name='project_name']").val()}, {'name': 'fixture_type', 'value': $("input[name='fixture_type']").val()}, {'name': 'specifying_company', 'value': $("input[name='specifying_company']").val()}, {'name': 'project_location', 'value': $("input[name='project_location']").val()}, {'name': 'contact', 'value': $("input[name='contact']").val()}, {'name': 'quantity', 'value': $("input[name='quantity']").val()}, {'name': 'item_number', 'value': $("input[name='item_number']").val()}, {'name': 'email', 'value': $("input[name='email']").val()}, ], "legalConsentOptions": { "consent": { "consentToProcess": true, "text": "I agree to allow Evo-Lite to store and process my personal data." } }, 'skipValidation': true, }; $.ajax({ url: 'https://api.hsforms.com/submissions/v3/integration/submit/4212798/928e4bbb-bc49-4c67-9a2e-f2472a10b9ae', type: 'POST', contentType: 'application/json', data: JSON.stringify(formData), // Viktigt: Konverter JavaScript-objektet til en JSON-streng success: function(response) { console.log('Formular sendt succesfuldt:', response); // Håndter succes her, f.eks. vis en takkebesked }, error: function(xhr, status, error) { console.error('Fejl ved afsendelse af formular:', status, error, xhr.responseText); // Håndter fejl her, f.eks. vis en fejlmeddelelse til brugeren } }); } Vigtige ændringer:
- Vi bruger
$.ajax()i stedet for$.post(). contentType: 'application/json'er tilføjet for eksplicit at angive, at vi sender JSON-data.data: JSON.stringify(formData)er afgørende. Dette konverterer dit JavaScript-objekt (formData) til en JSON-streng, som er det format, HubSpot API'et forventer. UdenJSON.stringify()ville dataene blive sendt som et JavaScript-objekt, hvilket jQuery ville forsøge at serialisere somapplication/x-www-form-urlencoded.- Tilføjet
successogerrorcallbacks for bedre fejlfinding og brugerfeedback.
Tabel: $.post() vs. $.ajax() for JSON
For at illustrere forskellen, her er en tabel, der sammenligner, hvordan de to metoder håndterer JSON-data:
| Egenskab | $.post(url, data) (Standard) | $.ajax({ url, type, contentType, data }) |
|---|---|---|
| Standard Content-Type | application/x-www-form-urlencoded | Ikke sat som standard (afhænger af data) |
| JSON Data Håndtering | Sender data som nøgle-værdi-par (URL-enkodet) hvis data er et objekt. Kræver manuel JSON-strengificering og contentType. | Kræver contentType: 'application/json' og data: JSON.stringify(yourObject) for at sende JSON korrekt. |
| Fleksibilitet | Mindre fleksibel, primært til simple POST-anmodninger. | Meget fleksibel, giver fuld kontrol over alle aspekter af HTTP-anmodningen. |
Yderligere Overvejelser og Fejlfinding
Selvom den korrekte Content-Type og JSON-formatering ofte løser 415-fejl, kan der være andre faktorer at overveje:
- API Dokumentation: Dobbelttjek altid den specifikke API-dokumentation, du interagerer med. HubSpot API'et kan have yderligere krav eller ændringer.
- CORS (Cross-Origin Resource Sharing): Selvom CORS normalt resulterer i andre fejl (f.eks. i browserens konsol), kan det i sjældne tilfælde påvirke, hvordan anmodninger behandles. Sørg for, at din server tillader forespørgsler fra din domæne.
- HubSpot Specifikke Felter: Sørg for, at feltnavnene (f.eks. 'project_name') matcher præcis de egenskaber, der er defineret i din HubSpot-formular.
- API Nøgler/Tokens: Nogle API'er kræver godkendelse (f.eks. en API-nøgle i headers). Selvom dette normalt ikke giver en 415-fejl, er det værd at verificere.
- Browser Konsol: Hold altid din browsers udviklerkonsol åben, mens du tester. Den giver værdifuld information om netværksanmodninger og fejl.
Ofte Stillede Spørgsmål (FAQ)
Q1: Hvad er den mest sandsynlige årsag til en HTTP 415-fejl, når jeg sender data til et API?
A1: Den mest almindelige årsag er en forkert eller manglende Content-Type header, eller at dataene ikke er formateret som specificeret af API'et (f.eks. sender du ikke JSON, når API'et forventer JSON).
Q2: Kan jeg bruge $.post() til at sende JSON-data?
A2: Ja, men det kræver, at du manuelt konverterer dine data til en JSON-streng ved hjælp af JSON.stringify() og angiver contentType: 'application/json'. Det er dog ofte nemmere og mere overskueligt at bruge $.ajax() til disse formål.
Q3: Hvordan tjekker jeg, om min JSON-data er korrekt formateret?
A3: Du kan bruge online JSON-validatorer eller indsætte din JSON-streng i din browsers konsol og se, om den parses uden fejl. Sørg for, at alle strenge er omgivet af dobbelte anførselstegn, og at der ikke er afsluttende kommaer.
Q4: Hvad hvis jeg sender en fil? Hvilken Content-Type skal jeg bruge?
A4: Hvis du sender filer (f.eks. billeder eller dokumenter) sammen med andre data, skal du typisk bruge 'multipart/form-data' som Content-Type. Dette kræver en anden tilgang til dataforberedelse i JavaScript, ofte ved hjælp af FormData objektet.
Q5: Hvordan kan jeg være sikker på, hvilken type data HubSpot API'et forventer?
A5: Konsulter altid den officielle HubSpot API-dokumentation for den specifikke endpoint, du bruger. Dokumentationen vil tydeligt angive de forventede Content-Type headers og dataformater.
Konklusion
HTTP 415 Unsupported Media Type-fejlen kan virke skræmmende, men den er typisk et resultat af en misforståelse mellem klienten (din browser/kode) og serveren omkring dataformatet. Ved at forstå vigtigheden af Content-Type headeren og sikre, at dine data er korrekt formateret (oftest som JSON for moderne API'er), kan du nemt løse dette problem. Brug af $.ajax() med eksplicit angivelse af contentType: 'application/json' og JSON.stringify() er en pålidelig metode til at sende JSON-data og undgå 415-fejl, når du integrerer med tjenester som HubSpot. Husk altid at tjekke API-dokumentationen og bruge browserens udviklerkonsol til fejlfinding.
Hvis du vil læse andre artikler, der ligner Forstå HTTP 415: Media Type Fejl, kan du besøge kategorien Teknologi.
