Como postar um objeto definido pelo usuário personalizado em um URL?
-
25-09-2019 - |
Pergunta
MyObject myObject = new myObject (); myObject.name = "test"; myObject.address = "teste"; myObject.contactno = 1234; string url = "http://www.myurl.com/key/1234? " + myObject; webRequest myRequest = webrequest.create (url); webrosponse myResponse = myRequest.getResponse (); myResponse.close ();
Agora o acima não funciona, mas se eu tentar bater no URL manualmente dessa maneira, ele funciona-
"http://www.myurl.com/Key/1234?name=Test&address=test&contactno=1234
Alguém pode me dizer o que estou fazendo de errado aqui?
Solução
Nesse caso, "MyObject" chama automaticamente seu método tostring (), que retorna o tipo de objeto como uma string.
Você precisa escolher cada propriedade e adicioná -la à consulta juntamente com seu valor. Você pode usar a classe PropertyInfo para isso.
foreach (var propertyInfo in myobject.GetType().GetProperties())
{
url += string.Format("&{0}={1}", propertyInfo.Name, propertyInfo.GetValue(myobject, null));
}
O método getProperties () está sobrecarregado e pode ser invocado com flags de ligação, para que apenas as propriedades definidas sejam retornadas (como bindingflags.public para retornar apenas propriedades públicas). Ver: http://msdn.microsoft.com/en-us/library/kyaxdd3x.aspx
Outras dicas
Eu recomendaria definir como transformar o MyObject em valores de string de consulta. Faça um método no objeto que saiba definir propriedades para todos os seus valores.
public string ToQueryString()
{
string s = "name=" + this.name;
s += "&address=" + this.address;
s += "&contactno=" + this.contactno;
return s
}
Em seguida, em vez de adicionar myObject, adicione myObject.ToQueryString ().
Aqui está o método da tostragem que escrevi -
public override string ToString()
{
Type myobject = (typeof(MyObject));
string url = string.Empty;
int cnt = 0;
foreach (var propertyInfo in myobject.GetProperties(BindingFlags.Public | BindingFlags.Instance))
{
if (cnt == 0)
{
url += string.Format("{0}={1}", propertyInfo.Name, propertyInfo.GetValue(this, null));
cnt++;
}
else
url += string.Format("&{0}={1}", propertyInfo.Name, propertyInfo.GetValue(this, null));
}
return url;
}