dart 中的 http 请求与 postman 中的行为不同
http request in dart is not behaving the same as in postman
我正在尝试为在线投资经纪人 Questrade 编写一个使用 public API 的程序。
您在网站上手动生成刷新令牌,然后将其传递给请求以获取访问令牌。
Use the token you copied to redeem it for an access token and the server or practice server URL using the following command:
https://login.questrade.com/oauth2/token?grant_type=refresh_token&refresh_token=
or
https://practicelogin.questrade.com/oauth2/token?grant_type=refresh_token&refresh_token=
我在 postman 中按如下方式构造 GET 请求,它成功并接收到有效的 json 正文。
https://login.questrade.com/oauth2/token?grant_type=refresh_token&refresh_token=MT1men5gBhSXyv15e6j7gC4CrD8msq3P0
在 dart 中,我按如下方式构建请求...
static Future<AccessToken> getAccessToken(String refreshToken) async {
var uri = Uri.https("login.questrade.com", "/oauth2/token?grant_type=refresh_token&refresh_token=$refreshToken");
var response = await http.get(uri);
print(response);
var json = jsonDecode(response.body);
return AccessToken.fromJson(json);
}
但它给我的只是一个实际上 html 看起来像登录页面的响应(太大 post)。
所以端点似乎以不同的方式处理这些请求,但我无法弄清楚这两个请求有什么不同...
你创建的 Uri
是错误的,因为你使用路径作为编码数据的方式,但它不起作用,因为它会尝试编码 &
。如果您打印 uri
对象,您可以看到问题:
https://login.questrade.com/oauth2/token%3Fgrant_type=refresh_token&refresh_token=MT1men5gBhSXyv15e6j7gC4CrD8msq3P0
相反,在向 Uri.https
构造函数提供数据的地方做这样的事情:
void main() {
var refreshToken = 'MT1men5gBhSXyv15e6j7gC4CrD8msq3P0';
var uri = Uri.https(
'login.questrade.com',
'/oauth2/token',
<String, String>{
'grant_type': 'refresh_token',
'refresh_token': refreshToken,
},
);
print(uri);
// https://login.questrade.com/oauth2/token?grant_type=refresh_token&refresh_token=MT1men5gBhSXyv15e6j7gC4CrD8msq3P0
}
我正在尝试为在线投资经纪人 Questrade 编写一个使用 public API 的程序。
您在网站上手动生成刷新令牌,然后将其传递给请求以获取访问令牌。
Use the token you copied to redeem it for an access token and the server or practice server URL using the following command:
https://login.questrade.com/oauth2/token?grant_type=refresh_token&refresh_token=
or
https://practicelogin.questrade.com/oauth2/token?grant_type=refresh_token&refresh_token=
我在 postman 中按如下方式构造 GET 请求,它成功并接收到有效的 json 正文。
https://login.questrade.com/oauth2/token?grant_type=refresh_token&refresh_token=MT1men5gBhSXyv15e6j7gC4CrD8msq3P0
在 dart 中,我按如下方式构建请求...
static Future<AccessToken> getAccessToken(String refreshToken) async {
var uri = Uri.https("login.questrade.com", "/oauth2/token?grant_type=refresh_token&refresh_token=$refreshToken");
var response = await http.get(uri);
print(response);
var json = jsonDecode(response.body);
return AccessToken.fromJson(json);
}
但它给我的只是一个实际上 html 看起来像登录页面的响应(太大 post)。
所以端点似乎以不同的方式处理这些请求,但我无法弄清楚这两个请求有什么不同...
你创建的 Uri
是错误的,因为你使用路径作为编码数据的方式,但它不起作用,因为它会尝试编码 &
。如果您打印 uri
对象,您可以看到问题:
https://login.questrade.com/oauth2/token%3Fgrant_type=refresh_token&refresh_token=MT1men5gBhSXyv15e6j7gC4CrD8msq3P0
相反,在向 Uri.https
构造函数提供数据的地方做这样的事情:
void main() {
var refreshToken = 'MT1men5gBhSXyv15e6j7gC4CrD8msq3P0';
var uri = Uri.https(
'login.questrade.com',
'/oauth2/token',
<String, String>{
'grant_type': 'refresh_token',
'refresh_token': refreshToken,
},
);
print(uri);
// https://login.questrade.com/oauth2/token?grant_type=refresh_token&refresh_token=MT1men5gBhSXyv15e6j7gC4CrD8msq3P0
}