Передача параметров в веб-сервис JSON в Objective C - PullRequest
5 голосов
/ 02 апреля 2012

Я пытаюсь вызвать метод веб-сервиса и передать ему параметр.

Вот мои методы веб-сервиса:

    [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();
    }

Вот мой объективный код 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        
}

Итак, когда я вызываю GetHelloWorld, он прекрасно работает и:

NSLog(@"%@", retVal);

отображает HelloWorld, но как мне вызвать GetHelloWorldWithParam?Как передать параметр?

Я пытаюсь с помощью:

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

и добавляю в запрос две следующие строки:

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

У меня ошибка:

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()

Спасибо за помощь!Teddy

Ответы [ 2 ]

2 голосов
/ 10 апреля 2012

Я использовал ваш код и немного изменил. Пожалуйста, попробуйте следующее:

 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];

Остальная часть совпадает с вашим кодом (начиная со строки NSError *errorReturned = nil).

Теперь обычно этот код должен работать. Но если вы не внесли изменения, указанные ниже в вашем web.config, этого не произойдет.

Проверьте, содержит ли ваш файл web.config следующие строки:

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

Я решил это таким образом, надеюсь, это работает и для вас.

Если вам нужна дополнительная информация, пожалуйста, ответьте на следующие 2 вопроса:
. Добавить пары ключ / значение в NSMutableURLRequest
. Формат запроса не распознается для URL, неожиданно заканчивающегося

1 голос
/ 10 апреля 2012

Не берите контроль над потоком ответов вручную. Просто измените свой метод веб-сервиса, как показано ниже:

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

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

Убедитесь, что вы добавили [ScriptMethod(ResponseFormat = ResponseFormat.Json)], если хотите только предложить Json взамен. Но если вы не добавите это, то ваш метод будет способен обрабатывать как запросы XML, так и Json.

P.S. Убедитесь, что ваш класс веб-службы украшен [ScriptService]

...