2017-02-08 4 views
1

Ich habe eine iOS-App in obj-c geschrieben, die eine Abfrage in ein Suchfeld eingegeben und führt eine Multi-Match-Feld Abfrage auf der Elasticsearch API. Kann jemand bei der Formatierung des JSON-Anfragekörpers helfen? Dies ist ein Beispiel für den Körper der Abfrage bekomme ich würde zu formatieren mag:JSON Anfrage Körper - Ziel c Formatierung

GET /test/data/_search 
{ 
    "min_score": 1.6,<br/> 
    "query": { <br/> 
     "multi_match": {<br/> 
      "query": "smith",<br/> 
      "fields": ["name", "surname"]<br/> 
     }<br/> 
    },<br/> 
    "_source": ["name", "surname", "address"]<br/> 
}<br/> 

In meinem Code habe ich:

NSString *jsonRequest = [NSString stringWithFormat:@"{\"min_score\":\"1.6\",\"query\":{\"multi_match\":{\"name\",\"surname\":\"%@\"}},\"_source\":[\"name\",\"surname\",\"address\"]}",[self.searchTextField text]]; 

Wo [self.searchTextField text] den Wert genommen aus dem Suchfeld.

Aber ich bekomme diese Fehlermeldung, wenn sie von Elasticsearch zurück, wenn ich fragen:

Grund = „Unerwartetes Zeichen (‚‘(Code 44)): Es wurde ein Doppelpunkt auf separaten Feldname und Wert erwartet \ n in [Quelle:.

nur als Test unter Verwendung einer Abfrage nur ein Feld funktioniert gut passen, so dass es nur eine Formatierung Problem sein sieht

Leider vergaß hinzuzufügen, das ist, wo ich gesetzt die URL, mit der ich mit dem JSON posten kann b ody:

[self postDataToUrl:@"http://localhost:9200/test/data/_search?pretty=true" withJson:jsonRequest]; 

dies geht dann zu:

-(void)postDataToUrl:(NSString*)urlString withJson:(NSString*)jsonString 
{ 
    NSData* responseData = nil; 
    NSURL *url=[NSURL URLWithString:[urlString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]]]; 

    responseData = [NSMutableData data] ; 
    NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:url]; 
    [request setHTTPMethod:@"POST"]; 
    [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; 
    NSData *data = [jsonString dataUsingEncoding:NSUTF8StringEncoding]; 
    [request setHTTPBody:data]; 
    [request setValue:[NSString stringWithFormat:@"%lu", (unsigned long)[data length]] forHTTPHeaderField:@"Content-Length"]; 

    NSURLSession *session = [NSURLSession sharedSession]; 
    [[session dataTaskWithRequest:request 
       completionHandler:^(NSData *data, 
            NSURLResponse *response, 
            NSError *error) { 
        NSString *responseString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 
        NSLog(@"the final output is:%@",responseString); 
        NSError *lerror = nil; 
        NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:data options:0 error:&lerror]; 

       if (error != nil) { 
        NSLog(@"Error parsing JSON."); 
       } 
       else { 

Das ist alles funktioniert gut, wenn ich ein reguläres Spiel Körper zB passieren:

NSString *jsonRequest = [NSString stringWithFormat:@"{\"min_score\":\"1.6\",\"query\":{\"match\":{\"name\":\"%@\"}},\"_source\":[\"name\",\"surname\",\"address\"]}",[self.searchTextField text]]; 
+0

Soll das eine Abfragezeichenfolge sein? –

+4

Ihr JSON ungültig. Im "multi_match" -Wörterbuch gibt es keinen Wert für den Schlüssel "name". Sie sollten nicht manuell eine JSON-Zeichenfolge im Code erstellen, ein Wörterbuch erstellen und 'NSJSONSerialization' verwenden, um sie in eine gültige JSON-Zeichenfolge zu konvertieren. – dan

+0

Mögliches Duplikat von [Send POST Anfrage mit NSURLSession] (http://stackoverflow.com/questions/19099448/send-post-request-using-nsurlsession) –

Antwort

0

Möglicherweise möchten Sie den Inhalt überprüfen Ihre Suchergebnisse. Es sieht so aus, als ob Sie einen Zeilenumbruch \n haben, der die Zeichenkette vor dem Koma unterbricht. Sie können den Wagenrücklauf wie folgt entfernen:

NSString *newString = [[self.searchTextField text] stringByReplacingOccurrencesOfString:@"\n" withString:@""]; 
NSString *jsonRequest = [NSString stringWithFormat:@"{\"min_score\":\"1.6\",\"query\":{\"match\":{\"name\":\"%@\"}},\"_source\":[\"name\",\"surname\",\"address\"]}", newString]; 
0

überprüfen Sie die Post von @cybergen, die JSON Körper nicht richtig eingestellt wurde, erwartet Elastic eine JSON-Abfrage in diesem Format:

{ 
    "query": { 
    "multi_match" : { 
     "query": "smith", 
     "fields": [ "name", "surname" ] 
    } 
    } 
} 

ich formatierte Die JSON-Anforderungszeichenfolge stimmt mit der in meinem Code überein.

Verwandte Themen