我正在为一个musixmatch.com公开的API实现一个REST客户端(它根据一些部分搜索歌词,例如:歌曲名称、艺术家等等)。(REST/JSON的新手总数)。
我的客户代码:
import java.io.IOException;
import java.io.InputStream;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Invocation.Builder;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.Response;
import org.codehaus.jackson.JsonParseException;
import org.codehaus.jackson.JsonParser;
import org.codehaus.jackson.map.MappingJsonFactory;
import in.soumav.musixmatch.beans.MMResponse;
public class MusixMatchClient {
public static void main(String[] args) throws JsonParseException, IOException {
Client client = ClientBuilder.newClient();
WebTarget target = client.target("https://api.musixmatch.com").path("ws").path("1.1")
.path("matcher.lyrics.get")
.queryParam("q_track", "Wake Me Up")
.queryParam("q_artist", "Greenday")
.queryParam("apikey", "...my key...");
Builder builderRequest = target.request();
Response response = builderRequest.get();
if (Response.Status.OK.getStatusCode() == response.getStatus()) {
MappingJsonFactory factory = new MappingJsonFactory();
JsonParser parser = factory.createJsonParser((InputStream) response.getEntity());
MMResponse resp = parser.readValueAs(MMResponse.class);
System.out.println(resp.getMessage().getBody().getLyrics().getLyrics_body());
}
}
}当找到匹配时,JSON解析器将分析得很好。
当找到匹配时,API的响应(在POSTMAN中):
{
"message": {
"header": {
"status_code": 200,
"execute_time": 0.076157093048096
},
"body": {
"lyrics": {
"lyrics_id": 14080789,
"explicit": 0,
"lyrics_body": "Summer has come and passed\nThe innocent can never last\nWake me up when September ends\n\nLike my father's come to pass\nSeven years has gone so fast\nWake me up when September ends\n\nHere comes the rain again\nFalling from the stars\nDrenched in my pain again\nBecoming who we are\n\nAs my memory rests\nBut never forgets what I lost\n...\n\n******* This Lyrics is NOT for Commercial use *******",
"script_tracking_url": "https://tracking.musixmatch.com/t1.0/m_js/e_1/sn_0/l_14080789/su_0/rs_0/tr_3vUCADW8Npey61GB2HRIObKY4Sz3low2ucLdqisdi7cAswHSwWeSM5uhan_JCxhFMVX0wKQjr_6eciPf6twsVnnD4RPIGl8wpzGhgPLQRIkUkBP0Zga626PhvTK603MycNGrL9kMxuLM8iA8b8IYiLDV_WzIffNXs2ENvhz39AuqdldwE0H-mS51SpVUU21V--VBwXN1uBD3ra2GANeMeuvOMMP4-8sa1tE3FvaEVUaP-mqxgQtDJHG2_aY01nRNfzLPZ86xPscgeQMrPiILn5lpC7mkagXpQDqXo0MpoTnHZPFKqhrgiVNxkpZzX-oqam8DZflIgIe4zMtg2Y3QE8MvjE5vp500IZUOz-Q0GhVKfND5T6Yv3-jOuvkRkSxYbI8tJmRhbVe5XX3DATCdqAB7zYHrwyijL90yRJJzv2f-SC4E6f0J/",
"pixel_tracking_url": "https://tracking.musixmatch.com/t1.0/m_img/e_1/sn_0/l_14080789/su_0/rs_0/tr_3vUCAIcjYkNNhw02X2Dtvu6SSWbscstTuW8YKvMwxRjtwZRmYXk4v0xsOdvjifHmsY2VY5yQTLHPUONXovxMI4XXZKXkC4KwjUwXR1afVXX5JE010OvQ-IsmsFkZ7-wXEXWJEFH5WJoKALES1HdQPDGsDNy6J5mGQURtG9MsQTSnfRnNz6zJkWTLZZ2F1GnG9f7ncW8guku-lOOWYAPcs8--4U4A3uR47_hn6PBh-JvHaQ2lFUjD6L0JuKs_Bgx0nU6RN97H02EkD6xkYWtsjZytPEneUHf3IrikZMu-tWvoclj0imoww8c_8NlqvHXG8pHYFO4YLPwk5kqfRXlW2TtwmJ9u1Do048_UFyCLAIctEEZBJEfcwjSep7VwU3BOiaKhL2Cwe-xV-NdW5pSzAbRb8bZ5PRrUnD7P-7SzdDSbossTyt6O/",
"lyrics_copyright": "Lyrics powered by www.musixmatch.com. This Lyrics is NOT for Commercial use and only 30% of the lyrics are returned.",
"updated_time": "2016-02-06T23:07:22Z"
}
}
}
}但是,当没有找到匹配时,将返回以下响应(同时通过POSTMAN进行测试):
{"message":{"header":{"status_code":404,"execute_time":0.11416816711426},"body":[]}}但是,邮递员中的实际状态代码返回200 OK!由于主体等于空数组,JSON解析器无法解析它并抛出以下异常:
线程"main“org.codehaus.jackson.map.JsonMappingException:中的异常不能在in.soumav.musixmatch.beans.Message["body"]">Source: sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@d9345cd; line: 1, column: 74上反序列化START_ARRAY令牌中的in.soumav.musixmatch.beans.Body实例
我的对象映射如下:
MMResponse | Message \_\_\_\_\_\_|\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_ | | Header(status\_cd, Body execution\_time) | | Lyrics(lyrics\_id,lyrics\_body etc.)
问题:
发布于 2019-03-07 00:35:13
您从API收到的状态代码似乎与响应对象中的状态代码不匹配。因为此响应不应满足if条件Response.Status.OK.getStatusCode() == response.getStatus()
{"message":{"header":{"status_code":404,"execute_time":0.11416816711426},"body":[]}}如果API是错误的,并且您想绕过它,则需要从JSON响应中检查status_code。我建议如下:
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.commons.io.IOUtils;
...
if (Response.Status.OK.getStatusCode() == response.getStatus()) {
ObjectMapper mapper = new ObjectMapper();
// Validate object status status_code or message.header.status_code
String jsonString = IOUtils.toString(inputStream, StandardCharsets.UTF_8.name());
JsonNode jsonObject = mapper.readTree(jsonString);
String statusCode =
jsonObject.get("message")
.get("header")
.get("status_code")
.toString();
if(statusCode.equalsIgnoreCase("200")) {
MappingJsonFactory factory = new MappingJsonFactory();
JsonParser parser = factory.createJsonParser((InputStream) response.getEntity());
MMResponse resp = parser.readValueAs(MMResponse.class);
System.out.println(resp.getMessage().getBody().getLyrics().getLyrics_body());
}
}上面的实现使用Jackson和commons。在下一个依赖项中可以找到IOUtils:
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.2</version>
</dependency>https://stackoverflow.com/questions/55034209
复制相似问题