How to Use Patch Verb with Curl

I am trying to make a PATCH call to a server. I am using the following command:

curl --data status=closed -X PATCH  

Is this the correct way of sending the PATCH request? I am getting an error saying there is no status parameter set. I am guessing the --data is for POST request only and thus the server doesn't find the status parameter.

This is the response (FYI):

{"http_status":400,"error":"Parameter validation errors","validation_errors":{"status":{"error":"Request missing status parameter."}}}

You can find documentation about this service here.

6 Answers

This is the format you should use:

curl --request PATCH 

That API seems to want the status parameter as a query parameter on the url, not part of the PATCH body.

At this point the server is going to return a 401 error: "You must be logged in to modify page settings." Assumedly you have to login first with something like this:

curl --request POST ""

I've used the credentials from their documentation in that example, which I figured would work on their dev server, but its currently returning an "Incorrect password" error.

If you have valid credentials, though, you should get back a session cookie which you can then use to authenticate your PATCH request.

4

I was trying to PATCH to a tastypie resource with a similar curl request. For me the problem was the data had to be passed in like so:

curl --data '{"field": "new_value"}' -X PATCH 

Notice how what I pass to the data flag is inside of what looks like a dictionary passed as a string, rather than putting the param directly as in the question. Of course a param works too as already answered, but hopefully this helps some people.

1

For those who run it on Windows, with a complex patch expression for more than one property.
The following worked for me:

curl -X PATCH "" -H "Content-Type: application/json" -d [{"""op""":"""replace""","""value""":"""100""","""path""":"""/employmentEndSettings/daysLoginActive"""},{"""op""":"""replace""","""value""":"""retiree""","""path""":"""/employmentEndSettings/userRoleAfter"""}]

This is something which worked for me in my sample app.

curl --data 'id=57&equipment_type_name=57 edited' -X PATCH 
{
  "info": "Equipment type updation.",
  "response": {
    "status": "success",
    "message": "updateEquipmentType",
    "result": {
      "data": [
        [
          {
            "update_status": 1
          }
        ],
        {
          "fieldCount": 0,
          "affectedRows": 0,
          "insertId": 0,
          "serverStatus": 2,
          "warningCount": 0,
          "message": "",
          "protocol41": true,
          "changedRows": 0
        }
      ]
    }
  }
}

Your command line should work. As you can see in the PATCH RFC5789, the HTTP request is similar what curl sends (use --trace-ascii to get to see the full curl communication). You might want to change the Content-Type (using --header).

The mentioned missing status parameter is probably referring to contents in the request-body. Your "status=closed" data is possibly not in the right format (JSON?) or it is incomplete.

0

An alternative way is as follow, this is through a POST call though

curl --data status=closed  

I am guessing this is not a general way and only applies to this specific instance.

1

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Chloe Bennett

Chloe Bennett

Culture, Media & Entertainment Columnist

Chloe Bennett explores the intersection of pop culture, streaming entertainment, digital trends, and contemporary lifestyle. Her weekly commentary reaches thousands of culture enthusiasts.

Share this article
Twitter Facebook Pinterest