Android的发布JSON对象WCF接收空

Android的发布JSON对象WCF接收空

本文介绍了Android的发布JSON对象WCF接收空的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有我的Andr​​oid客户端的一个问题想一个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 =htt​​p://192.168.1.112/WCF2/Uplo​​adService.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的Andr​​oid);        尝试
        {            字符串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的Andr​​oid);
            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接收空的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-02 16:47