aquí un problema que no le encontrado solución
ps tengo un servicio wcf rest en un iis7
esta es mi simple interfaz
Código C++:
Ver original
[ServiceContract] public interface ISAERegistro { #region "test" [OperationContract] [WebInvoke( Method = "PUT", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, UriTemplate = "/testSendGetObject", BodyStyle = WebMessageBodyStyle.WrappedRequest)] TestEntity testSendObject(TestEntity sendGetObject); [OperationContract] [WebInvoke( Method = "PUT", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, UriTemplate = "/testAloneSendObject", BodyStyle = WebMessageBodyStyle.Wrapped)] void testAloneSendObject(TestEntity sendObject); [OperationContract] [WebGet( UriTemplate = "/testAloneGetObject", ResponseFormat = System.ServiceModel.Web.WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest )] TestEntity testAloneGetObject(); [OperationContract] [WebInvoke( Method = "PUT", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, UriTemplate = "/testSendGetString/{sendGetString}", BodyStyle = WebMessageBodyStyle.WrappedRequest)] string testSendGetString(string sendGetString); [OperationContract] [WebInvoke( Method = "PUT", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, UriTemplate = "/testAloneSendString/{sendString}", BodyStyle = WebMessageBodyStyle.Wrapped)] void testSendString(string sendString); [OperationContract] [WebGet( UriTemplate = "/testAloneGetString", ResponseFormat = System.ServiceModel.Web.WebMessageFormat.Json )] string testGetString(); #endregion }
la entidad
Código vb:
Ver original
namespace LuzDelSur.Tecnico.SAE.Registro.WCFEntity { [DataContract( Name="TestEntity " , Namespace="") ] public class TestEntity { [DataMember( Name="nombre", Order=1)] public string nombre { get; set; } [DataMember (Name="algo" , Order=2) ] public string algo { get; set; } } }
y la implementacion del servicio
Código C++:
Ver original
public class SAERegistro : ISAERegistro { #region "test" public TestEntity testSendObject(TestEntity sendGetObject) { return sendGetObject; } public void testAloneSendObject(TestEntity sendObject) { //:D } public TestEntity testAloneGetObject() { TestEntity tes = new TestEntity(); tes.algo = "abcdefghijklmnñopqrstuvwxyz"; tes.nombre = "´qweeraáéíóúñÑ!#$$%$&%&/(&?=))=(()/(&/%(/&°¬°/*'"; return tes; } public string testSendGetString(string sendGetString) { return sendGetString; } public void testSendString(string sendString) { //:D } public string testGetString(){ return "´qweeraáéíóúñÑ!#$$%$&%&/(&?=))=(()/(&/%(/&°¬°/*'"; } #endregion }
y mi cliente en android
Código Javascript:
Ver original
httpClient = HttpClientFactory.getDefaultHttpClient(); T salida = null; String aux = urlServidor + "/" + servicio.toString(); aux = aux.trim(); /** * este esplit se hace para formatear la peticion a una URI valida este * error se daba por ejeplo se daba una paametro con acentos o espacios */ // String[] parts = aux.split(":"); // // if(port!=null){ // parts[1]+=":"+port+"/"+servicio.toString(); // } // // URI uri = new URI(parts[0], parts[1], null); aux = (URI.create(aux)).toString(); StringEntity input = new StringEntity("{" + entityRequest.toString() + "}"); input.setContentType("application/json;charset=ISO-8859-1");// text/plain;charset=UTF-8 testingMonitor.writeLog("test", "URI parseada:" + aux); testingMonitor.writeLog("test", "entity a ser enviada :: {" + entityRequest.toString() + "}"); switch (metodo) { case RestClientConstants.Metodo.PUT: testingMonitor.writeLog("test", ">PUT"); HttpPut putRequest = new HttpPut(aux); // putRequest.setHeader("Accept", "text/json"); putRequest.setHeader("Content-type", "text/json; charset=ISO-8859-1"); if (!input.equals("{}")) { //input.setContentType("text/json"); putRequest.setEntity(input); testingMonitor.writeLog("test", "aniadio entity"); } else { testingMonitor.writeLog("test", "no aniadio entity"); } response = ejecutarMetodoSincrono(putRequest); // br = new BufferedReader( new // InputStreamReader((response.getEntity().getContent()))); // limpiar el entytiRequest al final de la petición break; } br = new BufferedReader( new InputStreamReader((response.getEntity().getContent()))); entityRequest.delete(0, entityRequest.length()); servicio = new StringBuilder(); testingMonitor.writeLog("test", "estatus code:" + response.getStatusLine().getStatusCode()); if (response.getStatusLine().getStatusCode() != 200) { String json=br.readLine(); throw new RuntimeException("Failed : HTTP error code : " + response.getStatusLine().getStatusCode()); } if (c != null) { String json=br.readLine(); // String json = br; json = json.trim(); testingMonitor.writeLog("test", "json repuesta:" + json); if (json.length() > 0) { salida = (T) gs.fromJson(json, c); } testingMonitor.writeLog("test", "salida clase parseada :" + salida.toString()); } return salida; }
basicamente , tiene mas codigo pero eso es lo que ejecuta para consumir el servicio , todo ok mientras no halla carcater como la enie o tildes ,
cuando envio y recibo string con simbolos raros no problemas
el problema es cuando el estring esta dentro de una clase como atributo , el esrvidor me reopnde con code estatus 400
.aniado l codigo que parsea el objeton
Código C++:
Ver original
@Override public void addObjetoRequest(String var, Object obj) { entityRequest.append("\""); entityRequest.append(var); entityRequest.append("\":"); entityRequest.append(gs.toJson(obj)); }
alguien le ha pasado? ...qeu encoder reibe el servicio wcf , talves tenga que configurar su web config . nose ,.espero alguna luz sobre esto , gracias.