简体   繁体   中英

HttpWebRequest method GET/POST not working?

I am working with GoogleApi. I want to get accesstoken as response using Google api. when I am sending httpwebrequest for getting access token then

When I used :- request.Method = "POST"

Exception:- HTTP method POST is not supported by this URL

When I used :- request.Method = "GET"

Exception:- System.Net.ProtocolViolationException: Cannot send a content-body with this verb-type

The actual request might look like:

POST /o/oauth2/token HTTP/1.1
Host: accounts.google.com
Content-Type: application/x-www-form-urlencoded

code=4/P7q7W91a-oMsCeLvIaQm6bTrgtp7&
client_id=8819981768.apps.googleusercontent.com&
client_secret={client_secret}&
redirect_uri=https://oauth2-login-demo.appspot.com/code&
grant_type=authorization_code

A successful response is returned as a JSON array, similar to the following:

{
  "access_token":"1/fFAGRNJru1FTz70BzhT3Zg",
  "expires_in":3920,
  "token_type":"Bearer"

}

My Code is :-

    var request = (HttpWebRequest)WebRequest.Create(@"https://accounts.google.com");
    request.Method = "POST";
    request.ContentType = "application/json";
    //request.KeepAlive = false;

    // request.Headers[HttpRequestHeader.Authorization] = "";
    //request.ContentLength = 0;

    using (StreamWriter streamWriter = new StreamWriter(request.GetRequestStream()))
    {
        string json = "{\"code\":\"4/M1IIC8htCuvYORuVJK16oadDb3Gd.cigIKgaPjvUYXE-sT2ZLcbSrckCLgwI\"," + "\"client_id\":\"841994137170.apps.googleusercontent.com\"," + "\"client_secret\":\"MXjKvevD_cKp5eQWZ1RFXfdo\"," + "\"redirect_uri\":\"http://gmailcheck.com/response.aspx\"," + "\"grant_type\":\"authorization_code\"}";

        streamWriter.Write(json);
        // streamWriter.Flush();
        //streamWriter.Close();
    }
    try
    {
        using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
        {
            StreamReader responsereader = new StreamReader(response.GetResponseStream());

            var responsedata = responsereader.ReadToEnd();
            //Session["responseinfo"] = responsereader;     
        }
    }
    catch (WebException ex)
    {
        using (WebResponse response = ex.Response)
        {
            var httpResponse = (HttpWebResponse)response;

            using (Stream data = response.GetResponseStream())
            {
                var sr = new StreamReader(data);
                throw new Exception(sr.ReadToEnd());
            }
        }
    }

This is the problem:

var request = (HttpWebRequest)WebRequest.Create(@"https://accounts.google.com");

That's not the URL you showed originally. That's just the domain root. You need:

var request = (HttpWebRequest)WebRequest.Create("https://accounts.google.com/o/oauth2/token");

I've removed the @ as your string doesn't include any line breaks or backslashes, so there's no benefit in using a verbatim string literal.

(Additionally, I'd expect this to be covered in the Google Client APIs - is it not?)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM