我在日历中的事件中添加了一个打开的扩展名,并试图读回它。
这是网址:
https://graph.microsoft.com/v1.0/users/{userid}/calendars/{calendarId}=/events?$expand=Extensions($filter=Id eq 'c.i.m.p.server.entities.outlook.Event')
我无法让它在 Java 程序中工作。 以下组合确实有效:
- 如果我删除$expand,它可以工作我的 Java 程序......参数。 我也可以要求某些字段,这也有效。
- 该请求在邮递员中工作(我只需要设置令牌(
- 当我以日历所有者身份登录时,该请求在 Graph 资源管理器中有效
这是我使用 Postman 读取事件时的扩展(在其中一个事件内(。它是事件中的最后一项:
"extensions@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users('{userid}')/calendars('{calendarId}')/events('{eventId})/extensions",
"extensions": [
{
"@odata.type": "#microsoft.graph.openTypeExtension",
"id": "Microsoft.OutlookServices.OpenTypeExtension.c.i.m.p.server.entities.outlook.Event",
"extensionName": "c.i.m.p.server.entities.outlook.Event",
"adherentId": "12346",
"timeSlotID": "346463"
}
]
以下是Java代码(Java 8,使用 java.io 和 java.net 库(:
private static void doSomething(String _accessToken) throws IOException {
String urlString = "https://graph.microsoft.com/v1.0/users/{userId}/calendars/{calendarId}/events?$expand=Extensions($filter=Id eq 'c.i.m.p.server.entities.outlook.Event')";
URL url = new URL(urlString);
Proxy webProxy
= new Proxy(Proxy.Type.HTTP, new InetSocketAddress({proxy-address}, {port}));
HttpURLConnection connection = (HttpURLConnection) url.openConnection(webProxy);
// Set the appropriate header fields in the request header.
connection.setRequestProperty("Authorization", "Bearer " + _accessToken);
connection.setRequestProperty("Accept", "application/json");
connection.setDoOutput(true);
connection.setReadTimeout(5000);
connection.setRequestMethod(HttpMethod.GET);
try {
connection.connect();
int responseCode = connection.getResponseCode();
System.out.println("execute(), response code = " + responseCode);
String responseMessage = connection.getResponseMessage();
System.out.println("execute(), response Message = " + responseMessage);
String responseString = null;
try {
InputStream ins = connection.getInputStream();
BufferedReader br=new BufferedReader(new InputStreamReader(ins));
StringBuffer sb=new StringBuffer();
String line;
while ((line=br.readLine()) != null) {
sb.append(line);
}
responseString = sb.toString();
} catch (Exception e) {
System.out.println("Could not get input stream from response, error is " + e.toString());
}
System.out.println("execute(), httpResult = " + responseString);
} catch (IOException e) {
System.out.println(".execute(), IOException : " + e.toString());
} finally {
connection.disconnect();
}
}
我该如何解决这个问题? 谢谢!
> 400 表示错误的请求。这可能是因为网址编码。对查询字符串进行 URL 编码。
类似的东西
String query = "Extensions($filter=Id eq 'c.i.m.p.server.entities.outlook.Event'";
String url = "https://graph.microsoft.com/v1.0/users/{userId}/calendars/{calendarId}/events?
$expand=" + URLEncoder.encode(query, StandardCharsets.UTF_8.name());
或者,您可以根据需要使用图形服务 java api,这将有助于为您抽象所有交互,或者您可以使用任何可用的其余客户端。
首先,您应该提供有关错误的更多信息 - 堆栈跟踪和错误消息。但 400 代码表示这是用户错误,这意味着您正在发送无效请求。既然你说邮递员请求有效,那么比较邮递员发送的所有标头,看看你的代码是否错过了一些听众。至于代码,与其编写自己的Http客户端功能,我建议使用3d方Http客户端。以下是一些建议:
- Apache Http客户端 - 非常流行和知名的3d方Http客户端 OK Http 客户端
- - 开源 Http 客户端。这是教程 MgntUtils Http
- client - 非常简单的 3d party HttpClient:在 MgntUtils 开源库中提供(由我编写(。使用非常简单。看看Javadoc。库本身作为Maven工件和Git提供(包括源代码和Javadoc(。