在dart中将IBM watson的REST服务用作发布方法时遇到401错误

时间:2018-09-22 08:22:38

标签: authentication post dart flutter ibm-watson

这是我在dartLang中尝试发布方法的第一时间。 香港专业教育学院使用一个简单的rest api,您必须在其中发布一些字符串(文本),并将得到Json作为响应。 我还提供了正确的用户名和密码,但我最终收到的响应是{code:401,error:Unauthorized}。

我可以知道我错在哪里吗?我从未在DartLang中处理过Rest api的文章。

以下是其简单的文档https://www.ibm.com/watson/developercloud/personality-insights/api/v3/curl.html?curl

import 'package:untitled1/untitled1.dart' as untitled1;
import 'package:http/http.dart' as http;
import 'dart:async';
import 'dart:convert';


void main() async {

 Map hello;
 hello= await getjson();
 print(hello);

}



 Future<Map> getjson() async {
  String data;
 data= """ Insert Random long text """;



  var url = 'https://gateway.watsonplatform.net/personality- 
 insights/api/v3/profile?username=6cfcbb79-1801-4588-a1b3- 
  5c3ec101244f&password=YFM6h0rIFfzf';
     http.Response response= await http.post(url, body: data, headers: 
 {"accept" : "application/json","Content-Type": "text/plain"},);
   return json.decode(response.body);


     }

1 个答案:

答案 0 :(得分:0)

您提供的Watson参考显示了一个curl -u的示例。如果提供的curl没有特定的身份验证方法(例如摘要),则Basic默认为-u身份验证。因此,将用户名和密码添加到url并不相同。

Dart的http客户端支持基本身份验证,但将需要与服务器进行额外的往返,因此通常在每次请求时都发送凭据。以下代码使您摆脱了401错误。

import 'dart:convert';

import 'package:http/http.dart' as http;

main() async {
  http.Response r = await http.post(
    'https://gateway.watsonplatform.net/personality-insights/api/v3/profile',
    body: 'some random string',
    headers: {
      'Accept': 'application/json',
      'Authorization': basicAuthorizationHeader(
        '6cfcbb79-1801-4588-a1b3-5c3ec101244f',
        'YFM6h0rIFfzf',
      )
    },
  );
  print(r.statusCode);
  print(r.body);
}

String basicAuthorizationHeader(String username, String password) {
  return 'Basic ' + base64Encode(utf8.encode('$username:$password'));
}