我有一个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天,但我无法解决这个问题。
答案 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;
}
}
}