C# HTTP Body with GET method

31,462

Solution 1

What does one call an API that actively goes against REST? "HASTE"? "DISQUIET"?

With a bit of luck they service just doesn't care what the verb is and the PHP code was just happening to use GET and hit the bug that the server didn't block it which is a pretty minor bug as long as it behaves correctly, and it'll be fine with POST.

Failing that, your best bet is to see if they have an alternative method that either (if it's a reading request that naturally fits GET) accepts parameters in the URI with perhaps appropriate headers being used as per RFC 2616, or else can accept something through POST, GET etc.

If that doesn't work, you'll have to build an HTTP client on top of TcpClient. Which would be pretty horrible.

Solution 2

It is entirely possible, but you have to use the newer HttpClient class: https://stackoverflow.com/a/47902348/70345

Share:
31,462
Fernando
Author by

Fernando

Updated on July 09, 2022

Comments

  • Fernando
    Fernando almost 2 years

    I'm using an API that requires me to set the method to GET and include a message body. However when I try to do this I get the following error: "Cannot send a content-body with this verb-type". I read that the HttpWebRequest class does not support this and is the reason for the exception. Is there a work around?

    This is my current code: data is a json string encoded as a byte array

    HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
    request.Method = "GET";
    request.ContentType = "application/json";
    request.ContentLength = data.Length;
    using (Stream requestStream = request.GetRequestStream()) {
        requestStream.Write(data.ToArray(), 0, (int)data.Length);
    }
    

    This is the PHP code I'm trying to emulate

    <?php
    $data = array("id" => "1234");
    $data_string = json_encode($data);
    $ch = curl_init('url');
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        'Content-Type: application/json',
        'Content-Length: ' . strlen($data_string))
    );
    $result = curl_exec($ch);
    var_dump($result);
    ?>
    

    Thank you,