使用jQuery的$.ajax调用Twitter API 1.1搜索功能

3
这里是一个非常简单的调用Twitter搜索API的例子,用于获取已知有标签为#fml的推文。
我认为我正确地使用了仅应用程序身份验证,如此处所述:https://dev.twitter.com/docs/auth/application-only-auth(请参阅第3步以了解调用示例)。
我被要求提供不涉及任何服务器端代码的解决方案,因此在javascript中包含了承载码,但这本来就不好,但是......
我希望这段代码能够起作用。而实际上它产生了“400 (错误请求)”的错误。有什么想法吗?
$.ajax({
    url: "https://api.twitter.com/1.1/search/tweets.json",
    dataType: "jsonp",
    data: "q=%23fml",
    beforeSend:  function (xhr) { 
             xhr.setRequestHeader ("Authorization", "Bearer XXmyBearerCodeXX"); 
            },
    success: function(json){ alert(json); }
});

编辑1 - 验证Twitter调用

使用hurl.eu,我成功地通过上述查询和授权头从API获得了响应。因此,我认为这意味着我的Twitter调用是正确的,只是在jQuery.ajax()中没有正确设置,但我不知道缺少了什么。


我没有看到任何API密钥被发送。 - Ohgodwhy
@Ohgodwhy,我想既然消费者密钥已经在承载代码中编码了,我就不需要传递另一个API密钥。应该发送哪个密钥以及在哪里发送? - kscott
@Ohgodwhy,只是为了确保,我尝试了使用Hurl仅使用Bearer代码进行调用,它确实返回了数据。 - kscott
2个回答

6
您无法使用dataType为JSONP的AJAX调用设置请求标头。
请参阅此问题:如何在jQuery.ajax和JSONP中设置标头? 最佳解决方案是使用服务器端代理进行搜索。我知道您正在寻找仅客户端解决方案,但考虑到这种限制并且没有绕过CORS的方法,这似乎是今天针对Twitter API的解决方式。 编辑 如果您没有访问权限,则可以使用像Yahoo的YQL这样的代理来实现。

很棒的信息...但不是我想要听到的答案 :( - Clayton Selby

0
在您的服务器端创建一个JSP或Servlet,然后从客户端发起JSON调用到.jsp/servlet,它会将JSON对象返回给JavaScript。在服务器端使用Twitter4j API。 示例代码:`

$.getJSON(http://localhost:8080/test.jsp?callback=?",
            {
                jspqueryStr : queryStr,
                jspgeocodeStr : geocodeStr,
                lat:latStr,
                lan:lngStr, 
                radius:radiusStr,
            }, displayResult);
//This function returns the data as json object from server.
function displayResult(data) {}

在JSP中,代码如下:
<%
String jspqueryStr = request.getParameter("jspqueryStr");
String jspgeocodeStr = request.getParameter("jspgeocodeStr");
String diseasename = request.getParameter("jspqueryStr");
String lat = request.getParameter("lat");
String lan = request.getParameter("lan");
String radius = request.getParameter("radius");

Gson gson = new Gson(); 
String json = gson.toJson(tweetList);
json = request.getParameter("callback") + "(" + json + ");";
out.println(json);

public List<Status> searchstream(){
//here all the twitter4j api code to get the data 
retrun tweetList;
}

%>
`

感谢您的回答,在这种特殊情况下,我没有使用任何服务器端代码的能力。 - kscott

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接