As Majenko Said,
WiFiClient is raw in the sense you have to deal with the HTTP protocol stuff yourself, a shot snippet of raw GET request is provided below
WiFiClient wc;
wc.print("GET ");
wc.print(/xml/device_description.xml);
wc.println(" HTTP/1.1");
wc.print("Host: ");
wc.println(selectedDevice->getIp());
wc.println("Connection: close"); //automatically close Connection
wc.println("");
each line is terminated with "\r\n", the request is terminated with an empty line
Where as the HttpClient is a library which handle all the low level HTTP protocol stuff and provide simple interface to sent HTTP GET/POST request to any device that support HTTP
HTTPClient http;
http.begin(serverName);
http.addHeader("Content-Type", "text/plain");
int httpResponseCode = http.POST("Hi Sending POST request");
Serial.println(httpResponseCode);
http.end();
To send JSON change the header with the below line
http.addHeader("Content-Type", "application/json");
So the answer is if you want to deal with the low level HTTP protocol use WiFiClient else use HTTPClient