问题描述
我有我的Android客户端的一个问题想一个JSON类张贴到我的WCF服务。
WCF是接受职位,但参数为空
下面是code为Android客户端:
私人无效EnviaDados(DadosUsuario usuario,字符串文件名,字符串pAssunto,字符串pComentario,字符串pOnde,字符串pQuando)抛出异常
{ 文件名= fileName.substring(fileName.indexOf($$$)+ 3,fileName.length());
文件名= fileName.substring(0,fileName.indexOf($$$)); HttpClient的HttpClient的=新DefaultHttpClient();
字符串URL =http://192.168.1.112/WCF2/UploadService.svc/REST/ArqInfoAndroid; 串pNome = usuario.RetornaDados()[0];
串pDDD = usuario.RetornaDados()[1];
串pTelefone = usuario.RetornaDados()[2];
串pEmail = usuario.RetornaDados()[3];
字符串pregiao = usuario.RetornaDados()[4]; 尝试{ URI URI =新的URI(URL); HttpPost postRequest =新HttpPost(URI); StringEntity SE =新StringEntity(retornaJson(pNome,pEmail,pDDD,pTelefone,pregiao,文件名,pComentario,pOnde,pAssunto,pQuando)的ToString()); postRequest.setEntity(SE); postRequest.setHeader(接受,应用/ JSON);
postRequest.setHeader(内容类型,应用/ JSON;); HTT presponse响应= httpClient.execute(postRequest); 。INT站code = response.getStatusLine()的getStatus code(); 如果(STA code == 200 ||站code == 400){ InputStream的河道= response.getEntity()的getContent()。
字符串资源= convertStreamToString(插播广告); 如果(res.contains((FALHA)))
{
抛出新的异常(Falha AO投递arquivo);
} } }赶上(UnsupportedEncodingException五){
}赶上(ClientProtocolException E){
}赶上(IOException异常五){
}赶上(的URISyntaxException E){
}}
公共JSONStringer retornaJson(诺姆字符串,字符串电子邮件,字符串DDD,字符串telefone,字符串regiao,字符串arquivo,字符串comentario,字符串ONDE,字符串ASSUNTO,字符串quando)
{
JSONStringer DadosUsu =新JSONStringer();
尝试
{
DadosUsu.object()
。关键(DadosUsuario)。对象()。键(诺姆)
.value的(诺姆).KEY(电子邮件)
.value的(电子邮件)。关键(DDD)
.value的(DDD).KEY(Telefone)
.value的(telefone).KEY(Regiao)
.value的(regiao).KEY(NomeArq)
.value的(arquivo).KEY(Comentario)
.value的(comentario).KEY(的Onde)
.value的(ONDE).KEY(ASSUNTO)
.value的(ASSUNTO).KEY(Quando)
.value的(quando).endObject()endObject()。 }
赶上(例外JE)
{
} 返回DadosUsu;
}
下面是code为WCF (参数dadosUsuario为null)
[WebInvoke(方法=POST,RequestFormat = WebMessageFormat.Json,ResponseFormat = WebMessageFormat.Json,BodyStyle = WebMessageBodyStyle.WrappedRequest,UriTemplate =ArqInfoAndroid)]
公共字符串ArqInfoAndroid(DadosUsu dadosUsuario)
{ EscreverNoLog(Recebendo dadosusuário的Android); 尝试
{ 字符串absFileName =的String.Format({0} \\\\ \\\\的FileUpload {1}
,AppDomain.CurrentDomain.BaseDirectory
,dadosUsuario.NomeArq);
GerenciaThread PTH =新GerenciaThread();
EscreverNoLog(Recebendo dadosusuárioAndroid的:+
dadosUsuario.Nome + - +
dadosUsuario.Email + - +
dadosUsuario.DDD + - +
dadosUsuario.Telefone + - +
dadosUsuario.Regiao + - +
absFileName + - +
dadosUsuario.Comentario + - +
dadosUsuario.Onde + - +
dadosUsuario.Assunto + - +
DateTime.ParseExact(dadosUsuario.Quando,DD / MM / YYYY,NULL));
pTh.ChamarThread(dadosUsuario.Nome,dadosUsuario.Email,dadosUsuario.DDD,dadosUsuario.Telefone,dadosUsuario.Regiao,absFileName,dadosUsuario.Comentario,dadosUsuario.Onde,dadosUsuario.Assunto,DateTime.ParseExact(dadosUsuario.Quando,DD / MM / YYYY,NULL)); 返回确定;
}
赶上(异常前)
{
EscreverNoLog(埃罗recebimento DOS dadosusuário的Android);
EscreverNoLog(Mensagem德埃罗recebimento DOS dadosusuárioAndroid的:+ ex.Message);
返回FALHA:+ ex.Message;
} } 公共类DadosUsu
{
私人字符串诺姆;
私人字符串电子邮件;
私人字符串DDD;
私人字符串telefone;
私人字符串regiao;
私人字符串nomearq;
私人字符串comentario;
私人字符串ONDE;
私人字符串ASSUNTO;
私人字符串quando;
[数据成员(NAME =诺姆)]
公共字符串诺姆
{
{返回诺姆; }
集合{诺姆=价值; }
} [数据成员(名字=电子邮件)]
公共字符串的电子邮件
{
{返回电子邮件; }
集合{电子邮件=价值; }
} [数据成员(NAME =DDD)]
公共字符串DDD
{
{返回国内长途; }
集合{DDD =价值; }
} [数据成员(NAME =Telefone)]
公共字符串Telefone
{
{返回telefone; }
集合{telefone =价值; }
} [数据成员(NAME =Regiao)]
公共字符串Regiao
{
{返回regiao; }
集合{regiao =价值; }
} [数据成员(NAME =NomeArq)]
公共字符串NomeArq
{
{返回nomearq; }
集合{nomearq =价值; }
}
[数据成员(NAME =Comentario)]
公共字符串Comentario
{
{返回comentario; }
集合{comentario =价值; }
}
[数据成员(NAME =的Onde)]
公共字符串的Onde
{
{返回ONDE; }
集合{ONDE =价值; }
} [数据成员(NAME =ASSUNTO)]
公共字符串ASSUNTO
{
{返回ASSUNTO; }
集合{= ASSUNTO价值; }
} [数据成员(NAME =Quando)]
公共字符串Quando
{
{返回quando; }
集合{quando =价值; }
}
}
在你的操作(与车身风格 WrappedRequest
)参数名称为 dadosUsuario 。在你创建了Android code中的JSON,属性的名称为 DadosUsuario 。该案件是很重要的 - 试图将其更改为 dadosUsuario
(或在操作改变参数的名称有大写的第一个字母),它应该工作。
在一个不相关的音符 - 你不需要指定的 [数据成员]
属性名称
属性因为他们是相同的名称作为类的属性。它不会伤害,但。
I having a problem with my android client trying to post a JSON class to my wcf service.Wcf is receiving the post, but the parameter is null
Here is the code for android client :
private void EnviaDados( DadosUsuario usuario, String fileName, String pAssunto, String pComentario, String pOnde, String pQuando ) throws Exception
{
fileName = fileName.substring( fileName.indexOf("$$$")+3 , fileName.length() );
fileName = fileName.substring( 0, fileName.indexOf("$$$") );
HttpClient httpClient = new DefaultHttpClient();
String url = "http://192.168.1.112/WCF2/UploadService.svc/REST/ArqInfoAndroid";
String pNome = usuario.RetornaDados()[0];
String pDDD = usuario.RetornaDados()[1];
String pTelefone = usuario.RetornaDados()[2];
String pEmail = usuario.RetornaDados()[3];
String pRegiao = usuario.RetornaDados()[4];
try {
URI uri = new URI(url);
HttpPost postRequest = new HttpPost(uri);
StringEntity se = new StringEntity(retornaJson(pNome, pEmail, pDDD,pTelefone, pRegiao, fileName, pComentario, pOnde, pAssunto, pQuando).toString());
postRequest.setEntity(se);
postRequest.setHeader("Accept", "application/json");
postRequest.setHeader("Content-type", "application/json;");
HttpResponse response = httpClient.execute(postRequest);
int staCode = response.getStatusLine().getStatusCode();
if (staCode == 200 || staCode == 400) {
InputStream instream = response.getEntity().getContent();
String res = convertStreamToString(instream);
if(res.contains(("FALHA")))
{
throw new Exception("Falha ao enviar arquivo");
}
}
} catch (UnsupportedEncodingException e) {
} catch (ClientProtocolException e) {
} catch (IOException e) {
} catch (URISyntaxException e){
}
}
public JSONStringer retornaJson(String nome, String email, String ddd, String telefone, String regiao, String arquivo, String comentario, String onde, String assunto, String quando)
{
JSONStringer DadosUsu = new JSONStringer();
try
{
DadosUsu.object()
.key("DadosUsuario").object().key("Nome")
.value(nome).key("Email")
.value(email).key("DDD")
.value(ddd).key("Telefone")
.value(telefone).key("Regiao")
.value(regiao).key("NomeArq")
.value(arquivo).key("Comentario")
.value(comentario).key("Onde")
.value(onde).key("Assunto")
.value(assunto).key("Quando")
.value(quando).endObject().endObject();
}
catch (Exception je)
{
}
return DadosUsu;
}
Here is code for Wcf (the parameter dadosUsuario is null)
[WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest, UriTemplate = "ArqInfoAndroid")]
public string ArqInfoAndroid(DadosUsu dadosUsuario)
{
EscreverNoLog("Recebendo dados usuário Android");
try
{
string absFileName = string.Format("{0}\\FileUpload\\{1}"
, AppDomain.CurrentDomain.BaseDirectory
, dadosUsuario.NomeArq);
GerenciaThread pTh = new GerenciaThread();
EscreverNoLog("Recebendo dados usuário Android: " +
dadosUsuario.Nome + " - " +
dadosUsuario.Email + " - " +
dadosUsuario.DDD + " - " +
dadosUsuario.Telefone + " - " +
dadosUsuario.Regiao + " - " +
absFileName + " - " +
dadosUsuario.Comentario + " - " +
dadosUsuario.Onde + " - " +
dadosUsuario.Assunto + " - " +
DateTime.ParseExact(dadosUsuario.Quando, "dd/MM/yyyy", null));
pTh.ChamarThread(dadosUsuario.Nome, dadosUsuario.Email, dadosUsuario.DDD, dadosUsuario.Telefone, dadosUsuario.Regiao, absFileName, dadosUsuario.Comentario, dadosUsuario.Onde, dadosUsuario.Assunto, DateTime.ParseExact(dadosUsuario.Quando, "dd/MM/yyyy", null));
return "OK";
}
catch (Exception ex)
{
EscreverNoLog("Erro recebimento dos dados usuário Android");
EscreverNoLog("Mensagem de Erro recebimento dos dados usuário Android: " + ex.Message);
return "FALHA: " + ex.Message;
}
}
public class DadosUsu
{
private string nome;
private string email;
private string ddd;
private string telefone;
private string regiao;
private string nomearq;
private string comentario;
private string onde;
private string assunto;
private string quando;
[DataMember(Name="Nome")]
public string Nome
{
get { return nome; }
set { nome = value; }
}
[DataMember(Name="Email")]
public string Email
{
get { return email; }
set { email = value; }
}
[DataMember(Name="DDD")]
public string DDD
{
get { return ddd; }
set { ddd = value; }
}
[DataMember(Name="Telefone")]
public string Telefone
{
get { return telefone; }
set { telefone = value; }
}
[DataMember(Name="Regiao")]
public string Regiao
{
get { return regiao; }
set { regiao = value; }
}
[DataMember(Name="NomeArq")]
public string NomeArq
{
get { return nomearq; }
set { nomearq = value; }
}
[DataMember(Name="Comentario")]
public String Comentario
{
get { return comentario; }
set { comentario = value; }
}
[DataMember(Name="Onde")]
public string Onde
{
get { return onde; }
set { onde = value; }
}
[DataMember(Name="Assunto")]
public string Assunto
{
get { return assunto; }
set { assunto = value; }
}
[DataMember(Name="Quando")]
public string Quando
{
get { return quando; }
set { quando = value; }
}
}
The parameter name in your operation (with body style WrappedRequest
) is dadosUsuario. In the JSON you're creating in the Android code, the name of the property is DadosUsuario. The case is important - try changing it to dadosUsuario
(or changing the parameter name in the operation to have its first character in upper case), and it should work.
On an unrelated note - you don't need to specify the Name
property on the [DataMember]
attributes since they're the same name as the properties of the class. It doesn't hurt, though.
这篇关于Android的发布JSON对象WCF接收空的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!