从 Postman 调用 Twitter API 有效,但从 Angular 2 应用程序调用却不行

Posted

技术标签:

【中文标题】从 Postman 调用 Twitter API 有效,但从 Angular 2 应用程序调用却不行【英文标题】:Calling Twitter API from Postman works, but from Angular 2 app it doesnt' 【发布时间】:2016-07-30 08:25:27 【问题描述】:

我正在尝试在我的应用中使用 Twitter API。

当我从 Postman 运行它时,它运行良好。

但是,当我从我的应用程序运行它时,使用谷歌浏览器我得到了

XMLHttpRequest 无法加载 https://api.twitter.com/1.1/search/tweets.json?q=canada。回应 预检请求未通过访问控制检查:否 'Access-Control-Allow-Origin' 标头出现在请求的 资源。因此不允许使用原点“http://localhost:3000” 使用权。响应的 HTTP 状态代码为 400。

这是我的代码

...

     getTweets(hashtag : string)
        var headers = new Headers();
        headers.append('Authorization', 'Bearer AAAAAAAAAAAAAAAAAAAAAONruQAAAAAAfxQda4njz64axXN9sw4U0oU%3Dr1niTwKwXoOZXmZczDKgN0wWHWEMPrPcnXXMgVQhiTIzays7J');
        var requestOptions = new MyRequest();
        requestOptions.headers = headers;

      return this.http.get('https://api.twitter.com/1.1/search/tweets.json?q=montreal', requestOptions);  
    


class MyRequest implements RequestOptionsArgs 
    public headers: Headers;

【问题讨论】:

您尚未将Access-Control-Allow-Origin 标头添加到您的标头中。该错误清楚地告诉您它是必需的。 【参考方案1】:

Twitter API 不支持 CORS,但支持 JSONP。所以你需要利用 Angular2 的 JSONP 支持。

这是一个示例。在引导你的应用程序时首先指定相应的提供程序:

import bootstrap from 'angular2/platform/browser'
import JSONP_PROVIDERS from 'angular2/http'
import AppComponent from './app.component'

bootstrap(AppComponent, [ JSONP_PROVIDERS ]);

然后注入 Jsonp 类(而不是 Http 类)并使用它来发出您的请求:

export class AppComponent 
  constructor(jsonp:Jsonp) 
    var url = 'https://api.twitter.com/1.1/search/tweets.json?q=montreal&callback=JSONP_CALLBACK';

    var headers = new Headers();
    headers.append('Authorization', 'Bearer AAAAAAAA(...)sw4U0oU%');

    jsonp.request(url,  method: 'Get', headers: headers )
     .subscribe((res) => 
       this.result = res.json()
     );

查看 rhis 问题了解更多详情:

I need to do a http request to a mail chimp subscription list via a component post

【讨论】:

谢谢,但不幸的是这不起作用。我收到 400 或 401 错误,当我查看 devtools 时,我什至没有将 Authorization 视为标头之一,所以我担心添加标头的语法不正确 我刚刚在文档中阅读了有关回调参数的内容:“如果提供,响应将使用带有给定名称回调的 JSONP 格式。此参数的实用性因要求而有所降低对此端点的请求的身份验证。”。见dev.twitter.com/rest/reference/get/search/tweets。 您是否导入了Headers 类? import Http, Headers, ... from 'angular2/http'。如果在导入中没有它,则不会发送标头,也不会出现错误消息... 是的,你是对的!我们可以发送标头,因为 jsonp 依赖于在 html 页面中添加脚本标签... 我们可以还是不能

以上是关于从 Postman 调用 Twitter API 有效,但从 Angular 2 应用程序调用却不行的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Zapier 的 Twitter API 进行身份验证?

Twitter API Postman:代码 32:无法验证您的身份

从 Google Apps 脚本调用 Twitter API

是否可以从 Postman 调用 SignalR Hub

Laravel API 调用失败。 PostMan 使用 Basic Auth 覆盖 Authorization 标头

从 postman 访问 keycloak API