【问题标题】:HTTP response code: 411 for URL: http://api.twitter.com/oauth/request_tokenHTTP 响应代码:411 用于 URL:http://api.twitter.com/oauth/request_token
【发布时间】:2011-10-01 00:42:03
【问题描述】:

修改:

参考:http://dev.twitter.com/pages/auth

我已经得到signature_base_string、signature_key、oauth_signature 和所有其他与twitter 教程相同的参数。

  1. signature_base_string POST&HTTPS%3A%2F%2Fapi.twitter.com%2Foauth%2Frequest_token&oauth_callback%3Dhttp%253A%252F%252Flocalhost%253A3005%252Fthe_dance%252Fprocess_callback%253Fservice_provider_id%253D11%26oauth_consumer_key%3DGDdmIQH6jhtmLUypg82g%26oauth_nonce%3DQP70eNmVz8jvdPevU3oJD2AfF7R7odC2XJcn4XlZJqk%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp% 3D1272323042%26oauth_version%3D1.0

  2. 签名密钥 oauth_consumer_secret="MCD8BKwGdgPHvAuvgvz4EQpqDAtx89grbuNMRd7Eh98&"

  3. oauth_signature 8wUi7m5HFQy76nowoCThusfgB+Q=

现在我请求http://api.twitter.com/oauth/request_token 使用“POST”方法并获取响应代码 411。 当我从 Firefox 请求它时,我使用了一个 servlet doGet()。 我在代码中遗漏了什么或任何错误?谁能帮帮我?

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    String base_url="http://api.twitter.com/oauth/request_token";
    String oauth_callback="http://api.twitter.com/1/statuses/public_timeline.json";
    String oauth_consumer_key="GDdmIQH6jhtmLUypg82g";
    String oauth_consumer_secret="MCD8BKwGdgPHvAuvgvz4EQpqDAtx89grbuNMRd7Eh98&";
    String oauth_signature_method="HMAC-SHA1";


    int oauth_timestamp=1272323042;
    String oauth_version="1.0";
    String oauth_nonce="QP70eNmVz8jvdPevU3oJD2AfF7R7odC2XJcn4XlZJqk";

    String oauth_signature="";

    String signature_base_string = null;
    try {
        signature_base_string = "POST"
                + "&"
                + URLEncoder.encode(
                        "https://api.twitter.com/oauth/request_token",
                        "UTF-8")
                + "&"
                + URLEncoder
                        .encode("oauth_callback=http%3A%2F%2Flocalhost%3A3005%2Fthe_dance%2Fprocess_callback%3Fservice_provider_id%3D11&oauth_consumer_key=GDdmIQH6jhtmLUypg82g&oauth_nonce=QP70eNmVz8jvdPevU3oJD2AfF7R7odC2XJcn4XlZJqk&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1272323042&oauth_version=1.0",
                                "UTF-8");
        System.out.println(signature_base_string);
    } catch (UnsupportedEncodingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    try {
        Mac mac = Mac.getInstance("HmacSHA1");
        SecretKeySpec secret = new SecretKeySpec(
                oauth_consumer_secret.getBytes(), "HmacSHA1");
        mac.init(secret);
        byte[] digest = mac.doFinal(signature_base_string.getBytes());

        BASE64Encoder encoder = new BASE64Encoder();
        oauth_signature=encoder.encode(digest);
        System.out.println(oauth_signature);

    } catch (Exception e) {
        System.out.println(e.getMessage());
    }

    URL url=new URL(base_url);

    HttpURLConnection httpURLCon=(HttpURLConnection)url.openConnection(MyProxy.getProxy());


    httpURLCon.setRequestMethod("POST");
    httpURLCon.setRequestProperty("Authorization", "OAuth "+"oauth_nonce='QP70eNmVz8jvdPevU3oJD2AfF7R7odC2XJcn4XlZJqk', oauth_callback='http%3A%2F%2Flocalhost%3A3005%2Fthe_dance%2Fprocess_callback%3Fservice_provider_id%3D11', oauth_signature_method='HMAC-SHA1', oauth_timestamp='1272323042', oauth_consumer_key='GDdmIQH6jhtmLUypg82g', oauth_signature='8wUi7m5HFQy76nowoCThusfgB%2BQ%3D', oauth_version='1.0'");
    httpURLCon.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; rv:5.0) Gecko/20100101 Firefox/5.0");


    /*Map<String,List<String>> headers= httpURLCon.getHeaderFields();

    Iterator<String> i=headers.keySet().iterator();
    while(i.hasNext()){
        String key=i.next();
        System.out.println(key);
        System.out.println(headers.get(key).toString());
        System.out.println("====================");
    }
    */

    httpURLCon.connect();
    InputStream is=null;
    if (httpURLCon.getResponseCode() != 200) {
        is = httpURLCon.getErrorStream();
    } else {
        is = httpURLCon.getInputStream();
    }

    byte[] b=new byte[1024*4];
    int read;
    while((read=is.read(b))!=-1){
        response.getOutputStream().write(b,0,read);
    }
}

消息: 错误 无法检索到请求的 URL

在尝试处理请求时:

POST /oauth/request_token HTTP/1.1 主持人:api.twitter.com 授权:OAuth的oauth_nonce = 'QP70eNmVz8jvdPevU3oJD2AfF7R7odC2XJcn4XlZJqk',oauth_callback = 'HTTP%3A%2F%2Flocalhost%3A3005%2Fthe_dance%2Fprocess_callback%3Fservice_provider_id%3D11',oauth_signature_method = 'HMAC-SHA1',oauth_timestamp = '1272323042',oauth_consumer_key = 'GDdmIQH6jhtmLUypg82g' , oauth_signature='8wUi7m5HFQy76nowoCThusfgB%2BQ%3D', oauth_version='1.0' 用户代理:Mozilla/5.0 (Windows NT 6.1; rv:5.0) Gecko/20100101 Firefox/5.0 缓存控制:无缓存 Pragma:无缓存 接受:文本/html、图像/gif、图像/jpeg、*; q=.2, /; q=.2 X-D-转发器:是的 最大前锋:10

遇到以下错误:

Invalid Request 

HTTP 请求的某些方面无效。可能的问题:

Missing or unknown request method
Missing URL
Missing HTTP Identifier (HTTP/1.0)
Request is too large
Content-Length missing for POST or PUT requests
Illegal character in hostname; underscores are not allowed 

您的缓存管理员是网站管理员。 生成于 2011 年 7 月 8 日星期五 06:41:34 GMT 由 google.com (squid/2.7.STABLE6)

================================================ ===========

参考:http://dev.twitter.com/pages/auth

我已经得到signature_base_string、signature_key、oauth_signature 和所有其他与twitter 教程相同的参数。

  1. signature_base_string POST&HTTPS%3A%2F%2Fapi.twitter.com%2Foauth%2Frequest_token&oauth_callback%3Dhttp%253A%252F%252Flocalhost%253A3005%252Fthe_dance%252Fprocess_callback%253Fservice_provider_id%253D11%26oauth_consumer_key%3DGDdmIQH6jhtmLUypg82g%26oauth_nonce%3DQP70eNmVz8jvdPevU3oJD2AfF7R7odC2XJcn4XlZJqk%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp% 3D1272323042%26oauth_version%3D1.0

  2. 签名密钥 oauth_consumer_secret="MCD8BKwGdgPHvAuvgvz4EQpqDAtx89grbuNMRd7Eh98&"

  3. oauth_signature 8wUi7m5HFQy76nowoCThusfgB+Q=

现在我请求 http://api.twitter.com/oauth/request_token 使用“POST”方法并获取响应代码 411。 当我从 Firefox 请求它时,我使用了一个 servlet doGet()。 我在代码中遗漏了什么或任何错误?谁能帮帮我?

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    String base_url="http://api.twitter.com/oauth/request_token";
    String oauth_callback="http://api.twitter.com/1/statuses/public_timeline.json";
    String oauth_consumer_key="GDdmIQH6jhtmLUypg82g";
    String oauth_consumer_secret="MCD8BKwGdgPHvAuvgvz4EQpqDAtx89grbuNMRd7Eh98&";
    String oauth_signature_method="HMAC-SHA1";


    int oauth_timestamp=1272323042;
    String oauth_version="1.0";
    String oauth_nonce="QP70eNmVz8jvdPevU3oJD2AfF7R7odC2XJcn4XlZJqk";

    String oauth_signature="";

    String signature_base_string = null;
    try {
        signature_base_string = "POST"
                + "&"
                + URLEncoder.encode(
                        "https://api.twitter.com/oauth/request_token",
                        "UTF-8")
                + "&"
                + URLEncoder
                        .encode("oauth_callback=http%3A%2F%2Flocalhost%3A3005%2Fthe_dance%2Fprocess_callback%3Fservice_provider_id%3D11&oauth_consumer_key=GDdmIQH6jhtmLUypg82g&oauth_nonce=QP70eNmVz8jvdPevU3oJD2AfF7R7odC2XJcn4XlZJqk&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1272323042&oauth_version=1.0",
                                "UTF-8");
        System.out.println(signature_base_string);
    } catch (UnsupportedEncodingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    try {
        Mac mac = Mac.getInstance("HmacSHA1");
        SecretKeySpec secret = new SecretKeySpec(
                oauth_consumer_secret.getBytes(), "HmacSHA1");
        mac.init(secret);
        byte[] digest = mac.doFinal(signature_base_string.getBytes());

        BASE64Encoder encoder = new BASE64Encoder();
        oauth_signature=encoder.encode(digest);
        System.out.println(oauth_signature);

    } catch (Exception e) {
        System.out.println(e.getMessage());
    }

    URL url=new URL(base_url);

    HttpURLConnection httpURLCon=(HttpURLConnection)url.openConnection(MyProxy.getProxy());


    httpURLCon.setRequestMethod("POST");
    httpURLCon.setRequestProperty("Authorization", "OAuth "+"oauth_nonce='QP70eNmVz8jvdPevU3oJD2AfF7R7odC2XJcn4XlZJqk', oauth_callback='http%3A%2F%2Flocalhost%3A3005%2Fthe_dance%2Fprocess_callback%3Fservice_provider_id%3D11', oauth_signature_method='HMAC-SHA1', oauth_timestamp='1272323042', oauth_consumer_key='GDdmIQH6jhtmLUypg82g', oauth_signature='8wUi7m5HFQy76nowoCThusfgB%2BQ%3D', oauth_version='1.0'");
    httpURLCon.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; rv:5.0) Gecko/20100101 Firefox/5.0");


    /*Map<String,List<String>> headers= httpURLCon.getHeaderFields();

    Iterator<String> i=headers.keySet().iterator();
    while(i.hasNext()){
        String key=i.next();
        System.out.println(key);
        System.out.println(headers.get(key).toString());
        System.out.println("====================");
    }
    */

    httpURLCon.connect();
    InputStream is=httpURLCon.getInputStream();
    byte[] b=new byte[1024*4];
    int read;
    while((read=is.read(b))!=-1){
        response.getOutputStream().write(b,0,read);
    }
}

例外:

java.io.IOException: Server returned HTTP response code: 411 for URL: http://api.twitter.com/oauth/request_token
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1313)
at com.twitterbridge.oauth.Oauth.doGet(Oauth.java:114)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Thread.java:619)

【问题讨论】:

  • 如果我可以问,这个练习的目的是什么?
  • 检查你的 oauth_callback,它的值似乎已经被编码了。试试 oauth_callback=http://...
  • 从不在任何帖子上显示您的消费者秘密。
  • 如果您从 Twitter 中剪切粘贴 OAuth 示例,这将无济于事,因为 oauth_timestamp 非常老旧且永远无法验证。

标签: java api rest twitter


【解决方案1】:

在我可以帮助您之前,您的 HTTP 错误 411 状态中的 InputStream 是什么?

添加以下代码。

InputStream is = null;
if (httpURLCon.getResponseCode() != 200) {
    is = httpURLCon.getErrorStream();
} else {
    is = httpURLCon.getInputStream();
}

更新:您的Authorization 标头值必须从不包含空格。该值必须是OAuth&lt;space&gt;&lt;comma-delimited-value-without-space&gt;

【讨论】:

  • 我想覆盖 Twitter Api。因为无法直接访问推特。
  • 你想覆盖 Twitter API?为什么?如果它有效,它就有效!顺便说一句,Twitter 知道他们为什么按原样创建 API。
  • 我的意思是我想写一个api来连接twitter api并具有相同的功能。一些像 twidroyd 这样的 twitter 客户端可以使用。
  • 我添加了 httpURLCon.setRequestProperty("Content-Length", "0");
  • 我添加了 httpURLCon.setRequestProperty("Content-Length", "0");我收到错误“无法验证 oauth 签名和令牌”。我认为它有效。但签名是错误的。
猜你喜欢
  • 2014-03-21
  • 2016-10-29
  • 2014-12-14
  • 1970-01-01
  • 2013-07-10
  • 2017-09-24
  • 1970-01-01
  • 2023-03-21
  • 2019-02-01
相关资源
最近更新 更多