Quero postar alguns dados de formulário em um URL especificado que não está dentro do meu próprio aplicativo da web. Ele tem o mesmo domínio, como "domain.client.nl". O aplicativo da web tem um url "web.domain.client.nl" e o url onde desejo postar é "idp.domain.client.nl". Mas meu código não faz nada ... alguém sabe o que estou fazendo de errado?
Wouter
StringBuilder postData = new StringBuilder();
postData.Append(HttpUtility.UrlEncode(String.Format("username={0}&", uname)));
postData.Append(HttpUtility.UrlEncode(String.Format("password={0}&", pword)));
postData.Append(HttpUtility.UrlEncode(String.Format("url_success={0}&", urlSuccess)));
postData.Append(HttpUtility.UrlEncode(String.Format("url_failed={0}", urlFailed)));
ASCIIEncoding ascii = new ASCIIEncoding();
byte[] postBytes = ascii.GetBytes(postData.ToString());
// set up request object
HttpWebRequest request;
try
{
request = (HttpWebRequest)HttpWebRequest.Create(WebSiteConstants.UrlIdp);
}
catch (UriFormatException)
{
request = null;
}
if (request == null)
throw new ApplicationException("Invalid URL: " + WebSiteConstants.UrlIdp);
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = postBytes.Length;
request.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)";
// add post data to request
Stream postStream = request.GetRequestStream();
postStream.Write(postBytes, 0, postBytes.Length);
postStream.Flush();
postStream.Close();
c#
post
httpwebrequest
wsplinter
fonte
fonte
WebClient
.Respostas:
Tanto o nome do campo quanto o valor devem ser codificados por url. o formato dos dados de postagem e da string de consulta são os mesmos
A maneira .net de fazer é algo assim
Isso cuidará da codificação dos campos e dos nomes dos valores
fonte
string postdata = outgoingQueryString.ToString();
lhe dará uma string com o valor"System.Collections.Specialized.NameValueCollection"
.ToString()
, embora agora não me lembre se foi durante o uso do RestSharp. Possibilidade definitiva. Obrigado pela correção.outgoingQueryString
estava funcionando conforme implícito no código de exemplo. Essas duas perguntas respondem a que - (1) HttpValueCollection e NameValueCollection e (2) Qualquer classe .NET que crie uma string de consulta com pares de valores de chave ou semelhantes .Experimente isto:
fonte
request.HaveResponse
terá que obter a resposta primeiro.HttpWebResponse response = (HttpWebResponse) request.GetResponse(); if (request.HaveResponse) { ... }
Você está codificando o formulário incorretamente. Você só deve codificar os valores:
editar
Eu estava errado. De acordo com a seção 8.2.1 da RFC1866, tanto os nomes quanto os valores devem ser codificados.
Mas para o exemplo dado, os nomes não têm caracteres que precisem ser codificados, portanto, neste caso, meu exemplo de código está correto;)
O código em questão ainda está incorreto, pois codificaria o sinal de igual, que é a razão pela qual o servidor da web não pode decodificá-lo.
Uma maneira mais adequada seria:
fonte