如何向Blazegraph发送text/turtle格式POST请求并获取JSON响应?
我来帮你排查下这个问题——明明设置了Accept头要求JSON格式,却还是收到XML响应,确实挺让人头疼的。咱们一步步来梳理可能的原因和对应的解决办法:
先确认
Accept头是否真的发送出去了
有时候代码里写了设置请求头的逻辑,但可能因为客户端框架、连接配置的问题,实际请求并没有带上这个头。你可以在发送请求前,打印出所有请求头来验证:// 打印当前连接的所有请求头 Map<String, List<String>> requestHeaders = con.getRequestProperties(); for (String headerName : requestHeaders.keySet()) { System.out.println(headerName + ": " + requestHeaders.get(headerName)); }重点看
Accept头的值是不是和你设置的完全一致,有没有被其他代码覆盖的情况。尝试调整
Accept头的内容
你当前设置的是application/sparql-results+json,application/json,有些SPARQL服务器对媒体类型的匹配比较严格,可能只识别特定的类型。可以试试只保留application/sparql-results+json:con.setRequestProperty("Accept", "application/sparql-results+json");或者反过来,只使用
application/json,看看服务器是否能正确响应。检查POST请求的
Content-Type头(如果是POST更新)
如果你的更新操作是通过POST请求发送的,一定要确保Content-Type头设置正确。对于SPARQL更新来说,通常需要设置为application/sparql-update:con.setRequestProperty("Content-Type", "application/sparql-update");服务器可能会因为
Content-Type不正确,忽略Accept头的协商,直接返回默认的XML格式。尝试添加格式请求参数
有些服务器不严格遵循HTTP内容协商规则,需要通过URL参数来指定响应格式。你可以在请求URL的末尾加上?format=json,强制要求返回JSON格式。用curl命令测试,排除代码问题
你可以用curl模拟相同的请求,看看服务器是否返回JSON,这样能快速定位是代码问题还是服务器问题:curl -X POST \ -H "Accept: application/sparql-results+json" \ -H "Content-Type: application/sparql-update" \ -d "你的SPARQL更新语句" \ "你的服务器请求URL"如果curl能得到JSON响应,那问题大概率出在你的Java代码里;如果curl也返回XML,那就要去查看服务器的文档,确认是否需要启用JSON响应的配置。
内容的提问来源于stack exchange,提问作者wnm3

