2016-01-23 3 views
0

Я изначально задал вопрос о веб-службе WCF, которую я пытался написать, а затем обнаружил, что веб-API ASP.net был более уместен для моих потребностей, из-за некоторой обратной связи здесь.C# Web API REST Service POST

Теперь я нашел хороший учебник, в котором рассказывается, как создать простую службу REST с помощью веб-API, который хорошо работает в значительной степени из коробки.

Мой вопрос

У меня есть метод POST на моем сервере REST службы:

// POST api/values/5 
    public string Post([FromBody]string value) 
    { 
     return "Putting value: " + value; 
    } 

Я POST к этому с помощью ПЛАКАТ, а также мой код # клиент C.

Однако бит, который я не понимаю, является причиной того, что я должен добавить знак «=» к данным POST, чтобы он читал: «= Вот мои данные, которые на самом деле являются строкой JSON»; а не просто отправить: «Вот мои данные, которые на самом деле являются строкой JSON»;

Мой C# клиент, который говорит на службу REST записывается следующим образом:

public string SendPOSTRequest(string sFunction, string sData) 
    { 
     string sResponse = string.Empty; 

     // Create the request string using the data provided 
     Uri uriRequest = GetFormRequest(m_sWebServiceURL, sFunction, string.Empty); 
     // Data to post 
     string sPostData = "=" + sData; 
     // The Http Request obj 
     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uriRequest); 
     request.Method = m_VERB_POST; 
     System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding(); 
     Byte[] byteArray = encoding.GetBytes(sPostData); 
     request.ContentLength = byteArray.Length; 
     request.ContentType = m_APPLICATION_FORM_URLENCODED;     

     try 
     { 
      using (Stream dataStream = request.GetRequestStream()) 
      { 
       dataStream.Write(byteArray, 0, byteArray.Length); 
      } 
      using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) 
      { 
       using (Stream stream = response.GetResponseStream()) 
       { 
        StreamReader reader = new StreamReader(stream, Encoding.UTF8); 
        sResponse = reader.ReadToEnd(); 
       }      
      } 
     } 
     catch (WebException ex) 
     { 
      //Log exception 
     } 

     return sResponse; 
    } 

    private static Uri GetFormRequest(string sURL, string sFunction, string sParam) 
    { 
     StringBuilder sbRequest = new StringBuilder(); 
     sbRequest.Append(sURL); 

     if ((!sURL.EndsWith("/") && 
      (!string.IsNullOrEmpty(sFunction))))    
     { 
      sbRequest.Append("/"); 
     } 
     sbRequest.Append(sFunction); 

     if ((!sFunction.EndsWith("/") && 
      (!string.IsNullOrEmpty(sParam)))) 
     { 
      sbRequest.Append("/"); 
     } 
     sbRequest.Append(sParam); 

     return new Uri(sbRequest.ToString()); 
    } 

Кто-нибудь может объяснить, почему я должен предварять знак «=», как в приведенном выше коде (string sPostData = "=" + sData;)?

Большое спасибо заранее!

+1

Вы не используете что-то вроде restsharp для этого? http://restsharp.org/ –

+0

@ KosalaW http://i.imgur.com/ybWKjSM.png: D – DSF

+0

Привет, Косала W, спасибо за это. Честно говоря, я не смотрел на это, но, может быть, и должен был. Моя задача - написать код клиента, который взаимодействует с кодом сервера, который в конечном итоге будет написан третьей стороной. Мне просто нужно предоставить тестовый жгут и руководство API. Имея это в виду, у вас есть обратная связь по вышеуказанному, поскольку добавление знака '=' к данным POST кажется неправильным, но если у меня есть, то я буду Я просто хотел бы понять немного больше? Спасибо, – Yos

ответ

1

Тип контента x-www-form-urlencoded - это ключевой формат. С помощью тел формы вы можете читать только один простой тип из тела запроса. Поскольку имя ожидается, но в этом случае не разрешено, вы должны префикс знака равенства, чтобы указать, что нет имени с последующим значением.

Однако вам следует отстраниться от принятия простых типов в теле действий вашего веб-администратора.

Вы можете использовать только один простой тип, если пытаетесь передать данные в тело HttpPost/HttpPut без прямого внедрения собственного MediaTypeFormatter, что вряд ли будет надежным. Создание легкого сложного типа, как правило, намного предпочтительнее, и значительно облегчит взаимодействие с другими типами контента, такими как application/json.

+0

Привет, Джонатан. Большое спасибо за это объяснение, это очищает меня. Теперь, когда я понимаю, почему, я могу подумать о том, как наилучшим образом решить проблему в моих ограничениях. Я беру на борт то, что вы говорите об использовании простых типов. Еще раз спасибо! – Yos