2015-06-25 36 views
5

Sto tentando di inviare richieste e ottenere risposte dall'API MailChimp. . finora, GET, POST e DELETE stanno funzionando bene comunque, PATCH risulta sempre in Bad Request puoi identificare l'errore in questo codice?Richiesta API PATCH REST

string data = "{\"name\": \"TestListTWOTWOTWO\"}"; 
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(uri); 
request.Headers[HttpRequestHeader.Authorization] = accessToken; 
request.Method = "PATCH"; 
request.ContentType = "text/plain;charset=utf-8"; 

System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding(); 
byte[] bytes = encoding.GetBytes(data); 
request.ContentLength = bytes.Length; 

    using (Stream requestStream = request.GetRequestStream()) 
    { 
     // Send the data. 
     requestStream.Write(bytes, 0, bytes.Length); 
    } 
    var response = (HttpWebResponse)request.GetResponse(); 
    var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd(); 

l'errore occidente sulla riga con request.GetResponse(); si tratta di un WebException gestita dicendo che il server remoto ha restituito un errore: (400) Bad Request

dopo aver verificato la risposta di errore, ecco la cosa dice

"Your request doesn't appear to be valid JSON: 

\nParse error on line 1:\nPATCH /3.0/lists/9bb\n^\n 
Expected one of: 'STRING', 'NUMBER', 'NULL', 'TRUE', 'FALSE', '{', '['" 
+0

È consigliabile allegare il messaggio di errore. – Opal

risposta

11

Molte librerie C# sembrano provare a utilizzare l'intestazione Expect: 100-Continue, che MailChimp/Akamai ha un problema quando combinato con PATCH. Hai due opzioni.

  1. Disattiva Aspettare: 100-Continua nella libreria HTTP. In una libreria C#, lo fai con una riga di codice come Client.DefaultRequestHeaders.ExpectContinue = False

  2. Tunnel la richiesta PATCH tramite HTTP POST utilizzando l'intestazione X-Http-Method-Override. Here's more details on that header.

+0

opzione 2 mi ha salvato la vita. Grazie mille, ora non sono neanche lontanamente in grado di strapparmi di nuovo i capelli –

+3

Anche l'opzione 2 mi ha salvato! Grazie! L'ho implementato con: request.Method = WebRequestMethods.Http.Post e request.Headers.Add ("X-Http-Method-Override", "PATCH") – DrewF

+0

L'opzione 1 ha funzionato per me ... grazie mille. .. –

0

Causa PATCH è piuttosto una nuova RFC, così non ti aspetteresti che più di alcuni servizi lo supportino affatto. Faresti meglio a controllarlo se il servizio lo supporta.

È possibile inviare una richiesta utilizzando il formato JSON, ma impostare il tipo di contenuto su "text/plain" è OK?

+0

fino ad ora, non ho riscontrato problemi con i metodi POST e GET usando text/plain come Content type –