WCF邮政运营合同返回400错误请求对于Android请求

时间:2015-09-05 00:26:41

标签: java c# android web-services wcf

我有一个WCF服务,当我尝试通过post发送json并且我的操作合同有一个参数时,我收到400个错误请求。

Obs:如果我的操作合同中没有这样的参数。同样的要求完美无缺。

[OperationContract] //没有参数工作正常。 bool AddCadastroJSon();

[OperationContract的] bool AddCadastroJSon(String json); //使用参数400错误请求。

我的合约

namespace CadastroTelefonesService
{
    [ServiceContract]
    public interface ICadastro
    {
        
        [WebInvoke(Method = "GET", ResponseFormat =WebMessageFormat.Json,UriTemplate = "addcliente/{nome};{telefone}")]
        [OperationContract]
        bool AddCadastro(String nome,  String telefone);

        [WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, UriTemplate = "listacliente")]
        [OperationContract]
        List<Cadastro> Lista();

        [WebInvoke(Method = "POST",ResponseFormat = WebMessageFormat.Json,RequestFormat = WebMessageFormat.Json,UriTemplate = "addclientejson" )]
        [OperationContract]
        bool AddCadastroJSon(String cadastro);
    }
}

我在Android中的HttpManager

  

/**
 * Created by Gabriel Santana on 8/26/2015.
 * Classe Responsável por fazer requisições HTTP e retornar um Request Package com o content.
 *
 */
public class HttpManager {
    public static String getData(RequestPackage p) {

        BufferedReader reader = null;
        HttpURLConnection con=null;
        //OkHttpClient client=null;
        URL url;
        String uri = p.getUri();
        if (p.getMethod().equals("GET")) {
            uri += "?" + p.getEncodedParams();
        }

        try {
            url = new URL(uri);
            con = (HttpURLConnection) url.openConnection();
            //client = new OkHttpClient();
            // con =  client.open(url);
            con.setRequestMethod(p.getMethod());
            JSONObject json = new JSONObject(p.getParams());
            String params = "params="+json.toString();
            if (p.getMethod().equals("POST")) {
                con.setDoOutput(true);
                con.setRequestProperty("Accept" , "application/json");
                con.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
                //OutputStreamWriter writer = new OutputStreamWriter(con.getOutputStream());
                OutputStream os = con.getOutputStream();
                BufferedWriter writer = new BufferedWriter(
                        new OutputStreamWriter(os, "UTF-8"));
                writer.write(params);
                writer.flush();

                writer.close();
                os.close();
            }

            StringBuilder sb = new StringBuilder();
            reader = new BufferedReader(new InputStreamReader(con.getInputStream()));

            String line;
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
            Log.i("fudeu",con.getResponseMessage()+con.getResponseCode());
            return sb.toString();

        } catch (Exception e) {
            try {
                Log.i("fudeu",con.getResponseMessage()+con.getResponseCode());
            } catch (IOException e1) {
                e1.printStackTrace();
            }
            e.printStackTrace();
            return null;
        } finally {
            if (reader != null) {
                try {

                    reader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                    return null;
                }
            }
        }

    }

}

我已经尝试了3天,但我无法解决这个问题。

1 个答案:

答案 0 :(得分:0)

I解决此问题使用与主端点相同的配置配置客户端端点。

更改端点配置以接收Wraped,

更改我的数据合同以接收流和反序列化。

    public bool AddCadastroJSon(Stream stream)
    {
       //Esse metodo recebe um stream pois a configuração o wcf não realiza o bind para a classe desejada.
        StreamReader reader = new StreamReader(stream);
        String JSONdata = reader.ReadToEnd();
        JavaScriptSerializer jsonSerializer = new JavaScriptSerializer();
        Cadastro cadastro = jsonSerializer.Deserialize<Cadastro>(JSONdata);
        var cadastroDao = new CadastroDao();
        return cadastroDao.AddCadastro(cadastro);
   }

如果您将接收更改为流,则需要删除Android请求中的标头。 public static String getData(RequestPackage p){

    BufferedReader reader = null;
    HttpURLConnection con=null;
    //OkHttpClient client=null;
    URL url;
    String uri = p.getUri();
    if (p.getMethod().equals("GET")) {
        uri += "?" + p.getEncodedParams();
    }

    try {
        url = new URL(uri);
        con = (HttpURLConnection) url.openConnection();
        //client = new OkHttpClient();
        // con =  client.open(url);
        con.setRequestMethod(p.getMethod());
        JSONObject json = new JSONObject(p.getParams());
        String params = "{\"cadastro\":["+json.toString()+"]}";
        //String params =json.toString();
        if (p.getMethod().equals("POST")) {
            con.setDoOutput(true);
            //con.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
            //con.setRequestProperty("Content-Type", "application/json");
            //con.setRequestProperty("Accept" , "application/json");
            //OutputStreamWriter writer = new OutputStreamWriter(con.getOutputStream());
            OutputStream os = con.getOutputStream();
            BufferedWriter writer = new BufferedWriter(
                    new OutputStreamWriter(os, "UTF-8"));
            writer.write(p.getGson());
            writer.flush();

            writer.close();
            os.close();
        }

        StringBuilder sb = new StringBuilder();
        reader = new BufferedReader(new InputStreamReader(con.getInputStream()));

        String line;
        while ((line = reader.readLine()) != null) {
            sb.append(line + "\n");
        }
        Log.i("fudeu",con.getResponseMessage()+con.getResponseCode());
        return sb.toString();

    } catch (Exception e) {
        try {
            Log.i("fudeu",con.getResponseMessage()+con.getResponseCode());
        } catch (IOException e1) {
            e1.printStackTrace();
        }
        e.printStackTrace();
        return null;
    } finally {
        if (reader != null) {
            try {

                reader.close();
            } catch (IOException e) {
                e.printStackTrace();
                return null;
            }
        }
    }