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

时间:2013-06-08 21:34:11

标签: ajax jquery twitter twitter-oauth

这是一个非常简单的示例,即调用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()中没有正确设置,但我只是看不到缺少的东西。

2 个答案:

答案 0 :(得分:6)

您无法使用带有dataType JSONP的AJAX调用设置请求标头。

请参阅此问题:Set Headers with jQuery.ajax and JSONP?

最佳解决方案是使用服务器端代理来搜索您。我知道你正在寻找一个仅限客户端的解决方案,但是由于这个限制,而且无法绕过CORS,这就是今天Twitter API的工作方式。

修改如果您无法访问代理,则可以使用Yahoo's YQL之类的代理。

答案 1 :(得分:0)

在你的severside上创建一个jsp或servlet,并从客户端对.jsp / servlet进行JSON调用,然后将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) {}

In the jsp the code is like below

<%
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;
}

%>
`