Pasar parameters a un service web JSON en el Objetivo C

Estoy intentando llamar a un método de service web y pasarle un parámetro.

Aquí están mis methods de service web:

[WebMethod] [ScriptMethod(ResponseFormat = ResponseFormat.Json)] public void GetHelloWorld() { Context.Response.Write("HelloWorld"); Context.Response.End(); } [WebMethod] [ScriptMethod(ResponseFormat = ResponseFormat.Json)] public void GetHelloWorldWithParam(string param) { Context.Response.Write("HelloWorld" + param); Context.Response.End(); } 

Aquí está mi código objective c:

 NSString *urlString = @"http://localhost:8080/MyWebservice.asmx/GetHelloWorld"; NSURL *url = [NSURL URLWithString:urlString]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; [request setHTTPMethod: @"POST"]; [request setValue:@"application/json" forHTTPHeaderField:@"Accept"]; [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; NSError *errorReturned = nil; NSURLResponse *theResponse =[[NSURLResponse alloc]init]; NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&theResponse error:&errorReturned]; if (errorReturned) { //...handle the error } else { NSString *retVal = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; NSLog(@"%@", retVal); //...do something with the returned value } 

Entonces, cuando llamo a GetHelloWorld, funciona bien y:

 NSLog(@"%@", retVal); 

mostrar HelloWorld, pero ¿cómo llamo a GetHelloWorldWithParam? ¿Cómo pasar un parámetro?

Yo trato con:

 NSMutableDictionary *dict = [NSMutableDictionary dictionary]; [dict setObject:@"myParameter" forKey:@"param"]; NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dict options:kNilOptions error:&error]; 

y agregue las dos líneas siguientes a la request:

 [request setValue:[NSString stringWithFormat:@"%d", [jsonData length]] forHTTPHeaderField:@"Content-Length"]; [request setHTTPBody: jsonData]; 

Tengo el error:

 System.InvalidOperationException: Missing parameter: test. at System.Web.Services.Protocols.ValueCollectionParameterReader.Read(NameValueCollection collection) at System.Web.Services.Protocols.HttpServerProtocol.ReadParameters() at System.Web.Services.Protocols.WebServiceHandler.CoreProcessRequest() 

¡Gracias por tu ayuda! Osito de peluche

He usado tu código y modificado un poco. Intente seguir primero:

  NSString *urlString = @"http://localhost:8080/MyWebservice.asmx/GetHelloWorldWithParam"; NSURL *url = [NSURL URLWithString:urlString]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; [request setHTTPMethod: @"POST"]; [request setValue:@"application/json" forHTTPHeaderField:@"Accept"]; [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; NSString *myRequestString = @"param="; // Attention HERE!!!! [myRequestString stringByAppendingString:myParamString]; NSData *requestData = [NSData dataWithBytes:[myRequestString UTF8String] length:[myRequestString length]]; [request setHTTPBody: requestData]; 

La parte de descanso es igual con su código (a partir de la línea NSError *errorReturned = nil ).

Ahora normalmente, este código debería funcionar. Pero si no ha realizado la modificación a continuación en su web.config , no lo hará.

Compruebe si su file web.config incluye las siguientes líneas:

 <configuration> <system.web> <webServices> <protocols> <add name="HttpGet"/> <add name="HttpPost"/> </protocols> </webServices> </system.web> </configuration> 

Lo he resuelto de esta manera, espero que funcione para usted también.

Si necesita más información, consulte estas 2 preguntas siguientes:
. Agregue pares key / valor a NSMutableURLRequest
. El formatting de request no está reconocido para la URL que termina inesperadamente en

No tome el control del flujo de respuesta manualmente. Simplemente cambie su método de service web un poco como a continuación:

 [WebMethod] [ScriptMethod(ResponseFormat = ResponseFormat.Json)] public string GetHelloWorld() { return "HelloWorld"; } [WebMethod] [ScriptMethod(ResponseFormat = ResponseFormat.Json)] public string GetHelloWorldWithParam(string param) { return "HelloWorld" + param; } 

Asegúrate de agregar [ScriptMethod(ResponseFormat = ResponseFormat.Json)] si solo quieres ofrecer Json a cambio. Pero si no agrega esto, entonces su método será capaz de manejar requestes XML y Json.

PS Asegúrese de que su class de service web esté decorada con [ScriptService]