2014-03-07 50 views
1

我試圖通過POST發送一個表單到我的REST資源(Java),我無法做到,因爲我的請求是作爲OPTIONS發送的。我知道REST資源很好,因爲它可以很好地工作,而我用Poster Firefox進行測試。jQuery發送OPTIONS而不是POST請求到本地主機上的REST

的jQuery/Ajax調用

function loadTwitter(){ 
      arrayTweets = new Array(); 
      var urlTwitter = "http://localhost:8081/streamingvideoservice/services/twitter/retrieveTweets"; 
      $.ajax({ 
        type: "POST", 
        url: urlTwitter, 
        contentType: "application/x-www-form-urlencoded", 
        //accept: "application/json", 
        data: $("form#mapForm").serialize(), 
        dataType: "json", 
        async: false, 
        success: function (resp, status, xhr) { 
         $("#message").html("STATUS: " + xhr.status + " " + xhr.statusText + "\n" + resp); 
         $("#message").hide(); 
         $.each(resp, function() { 
          $.each(this, function(i, item) { 
           arrayTweets.push(item); 
          }); 

         }); 

         displayTweets(); 
        }, 
        error: function(resp, status, xhr){ 
         $("#message").html("ERROR: " + xhr.status + " " + xhr.statusText + "\n" + resp.e); 
         $("#message").show(); 
        } 
       }); 
     } 

REST資源

@POST 
    @Path("/retrieveTweets") 
    @Consumes(MediaType.APPLICATION_FORM_URLENCODED) 
    @Produces("application/json") 
    public List<Tweet> retrieve(@FormParam("lat") Double Latitude, @FormParam("lon") Double Longitude, @FormParam("rad") Integer Radius, @FormParam("from") String From, @FormParam("to") String To) { 

     ArrayList<Tweet> lTweets = new ArrayList<Tweet>(); 
     boolean status = false; 

     Twitter twitter = new TwitterFactory().getInstance(); 

     AccessToken accessToken = new AccessToken(TwitterInterface.ACCESS_TOKEN, TwitterInterface.ACCESS_TOKEN_SECRET); 
     twitter.setOAuthConsumer(TwitterInterface.CONSUMER_KEY, TwitterInterface.CONSUMER_SECRET); 
     twitter.setOAuthAccessToken(accessToken); 

     try { 
      Query query = new Query(""); 
      GeoLocation geo = new GeoLocation(Latitude, Longitude); 
      query.setGeoCode(geo, Radius, Query.KILOMETERS); 
      query.setCount(100); 
      query.setSince(From); 
      query.setUntil(To); 
      QueryResult result; 
      result = twitter.search(query); 
      List<Status> tweets = result.getTweets(); 
      for (Status tweet : tweets) { 
       System.out.println("@" + tweet.getUser().getScreenName() + " - " + tweet.getText() + " - " + tweet.getCreatedAt()); 
       Tweet t = new Tweet(); 
       t.setUser(tweet.getUser().getScreenName()); 
       t.setText(tweet.getText()); 
       lTweets.add(t); 
      } 
     } 
     catch (TwitterException te) { 
      te.printStackTrace(); 
      System.out.println("Failed to search tweets: " + te.getMessage()); 
      System.exit(-1); 
     } 

     return lTweets; 

    } 

我使用jQuery 1.9.1,並在Tomcat 6託管資源

任何幫助表示讚賞。

在此先感謝。

+0

你在做CORS(跨源資源共享)請求嗎? – Satpal

+0

它都在同一臺機器上......所以它是一個localhost調用(就像你可以在我的ajax調用中看到的那樣)。你是這個意思嗎? – mzereba

+0

@Maged主機(本地主機)不是什麼決定它是否是跨域。 **港口**也很重要。您當前的Web應用程序是否也在端口8081上運行? – Ian

回答

-3

改爲用GET解決,並在URI中傳遞參數。

2

您似乎在製作一個跨源Ajax請求。這要求服務器提供一個Access-Control-Allow-Origin標頭,以授予承載包含JS的頁面以讀取數據的站點的權限。

有關請求的某些內容(可能是jQuery添加到Ajax請求中的X-Requested-With標頭)觸發preflight request,該請求使用OPTIONS請求在發出主請求之前向服務器請求權限。

您將需要配置服務器以按照CORS規範(上面鏈接)提供帶有適當訪問控制標頭的OPTIONS響應。

+0

感謝您的回答,我讀了您發給我的鏈接,但是如何讓我的資源提供「Access-Control-Allow-Origin」是Java部分還是服務器上的某個部分? (正如我提到的,我正在運行我的機器上的所有東西; HTML頁面調用資源運行tomcat。 – mzereba

+1

.htaccess文件可以做到這一點。 –

+1

對不起,我很困惑這裏。我必須在我的應用程序服務器上創建此文件,或web應用程序?以及哪些類型的命令必須在那裏? – mzereba

相關問題