jQuery ajax GET returns 405 Method Not Allowed
Asked Answered
M

2

2

I am trying to access an API that requires authentication. This is the code that i am using but i keep getting a 405 Method Not Allowed error. Any thoughts? (my username and password are correct)

function basic_auth(user, pass){
    var tok = user + ':' + pass;
    var hash = $.base64.encode(tok);
    return "Basic " + hash;
}
var auth = basic_auth('username','password');
var releaseName1 = "11.6.3";
var releaseName2 = "11.6.3 Confirmed";
$.ajax({
    type: "GET",
    url: "https://www10.v1host.com/Company/rest-1.v1/Data/Story?sel=Description,Number,Name,Timebox.Name,Parent,AssetState&where=Custom_Release2.Name='"+releaseName1+"','"+releaseName2+"';AssetState='64'",
    beforeSend: function(xhr){
        xhr.setRequestHeader('Authorization', auth);
    },
    dataType: "xml",
    async: false,
    success: parseXml
});
function parseXml(xml){
    $(xml).find("item");
}
Misconduct answered 29/6, 2011 at 15:26 Comment(2)
Both page are in the same domain?Slate
Did you mean that my page with this code is in the same domain as the page it is requesting? If so, then no they are not.Misconduct
P
2

You can't make javascript/Ajax calls across domains (without some serious kludging). What we've done for this in the past is to create a local jsp proxy that we call with our javascript but is just a pass-through to the remote URL.

Here is some example JSP code that is close to what I've used to hit a SOLR instance returning JSON.

final String ENCODING = "UTF-8"; // this is the default unless specified otherwise (in server.xml for Tomcat)
    // see http://tomcat.apache.org/tomcat-6.0-doc/config/http.html#Common_Attributes and
    // http://wiki.apache.org/tomcat/FAQ/CharacterEncoding#Q2
    final String URI_ENCODING = "ISO-8859-1";

    HashMap<String, String> defaultSettings = new HashMap<String, String>() {
        {
            put("wt", "json");
            put("rows", "10");
            put("start", "0");
        }
    };

    BufferedReader searchResponse = null;
    OutputStreamWriter forwardedSearchRequest = null;

    // TODO:  are there any headers that we need to pass on?
    // simply pass on the request to the search server and return any results
    try {
        URL searchURL = new URL("http://yourdestinationurlhere.com");
        HttpURLConnection conn = (HttpURLConnection) searchURL.openConnection();

        // read the request data and send it as POST data (unchanged)
        conn.setDoOutput(true);
        forwardedSearchRequest = new OutputStreamWriter(conn.getOutputStream());

        // at least for Tomcat 6.0, the default is really iso-8859-1, although it is reported as UTF-8
        // so, we will explicitly set it to URI_ENCODING in both places
        request.setCharacterEncoding(URI_ENCODING);

        String query = (String) request.getParameter("q");
        if ((query != null) && (! "".equals(query.trim()))) {
            query = URLEncoder.encode(query, request.getCharacterEncoding()); // we must use the same setting as the container for URI-encoding
            forwardedSearchRequest.write("&q=");
            forwardedSearchRequest.write(query);
        } else {
            // empty queries may return all results, so let's circumvent that
            forwardedSearchRequest.write("&q=help");
        }

        for(String key:defaultSettings.keySet()) {
            String resultType = (String) request.getParameter(key);
            if ((resultType == null) || "".equals(resultType.trim())) resultType = defaultSettings.get(key);
            forwardedSearchRequest.write("&"+key+"=");
            forwardedSearchRequest.write(resultType);
        }

        forwardedSearchRequest.flush();

        // read and forward the response
        // reset anything that may have been sent so far
        out.clearBuffer();

        // do this only if we have a 200 response code
        if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
            // the web server may be running as windows-1252, so let's ensure we have the right CS
            searchResponse = new BufferedReader(new InputStreamReader(conn.getInputStream(), ENCODING));

            String contentType = conn.getHeaderField("Content-Type");
            if ((contentType != null) && (! "".equals(contentType))) response.setHeader("Content-Type", contentType);

            String buffer;
            while ((buffer = searchResponse.readLine()) != null) out.println(buffer);
        } else {
            // dish out a mock-Solr-JSON response that includes a status and an error
            response.setHeader("Content-Type", "application/json");
            out.println("{ responseHeader: {status: -1, responseCode: " + conn.getResponseCode()  +
                ", responseMessage: \"" + conn.getResponseMessage() + "\" } }");
        }
    } catch (Exception e) {
        throw new ServletException("Exception - " + e.getClass().getName(), e);
    } finally {
        if (forwardedSearchRequest != null) forwardedSearchRequest.close();
        if (searchResponse != null) searchResponse.close();
    }
Phototypography answered 29/6, 2011 at 15:56 Comment(4)
that sounds like an option...do you have an example?Misconduct
@Misconduct did you have a chance to try this out? Did it work for you?Phototypography
I found out that my problem was that AJAX cannot make cross domain calls. I got around that through PHP. I used PHPs' cUrl to get the data and print it out, and then jQuery AJAX to call that PHP page that was holding that returned data. Thanks for the help though!Misconduct
I believe that's exactly what I said and suggested! Glad everything worked out for you.Phototypography
C
0

try to change your datatype to "jsonp" is you are trying to send a cross domain request

Central answered 7/12, 2013 at 22:5 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.