400 Bad Request for frappe.cloud API

Viewed 62

I'm getting 400 Bad Request for frappe.cloud API, when I'm trying to call it using golang code using http.NewRequest, this API is working fine when I check it using postman. following is the API

https://xxxx.frappe.cloud/api/resource/Item?fields=["name","item_name","item_group","description"]&filters=[["Item","item_group","=","xxx Product"]]

If I use the same golang code to call same API with out filters it works fine. following is the working API

https://xxxx.frappe.cloud/api/resource/Item?fields=["name","item_name","item_group","description"]

code as follows

func FetchProperties(dataChannel models.DataChannel) (map[string]interface{}, error) {
thisMap := make(map[string][]map[string]interface{})
client := &http.Client{}
req, err := http.NewRequest("GET", dataChannel.APIPath, nil)
if err != nil {
    commons.ErrorLogger.Println(err.Error())
    return nil, err
}
eds, err := GetDecryptedEDSByEDSID(dataChannel.EDSId)
if err != nil {
    commons.ErrorLogger.Println(err.Error())
    return nil, &commons.RequestError{StatusCode: 400, Err: err}
}
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Authorization", eds.DataSource.Auth.Token)
response, err := client.Do(req)
if err != nil {
    commons.ErrorLogger.Println(err.Error())
    return nil, err
}
data, err := ioutil.ReadAll(response.Body)
if err != nil {
    commons.ErrorLogger.Println(err.Error())
    return nil, &commons.RequestError{StatusCode: 400, Err: err}
}
if response.StatusCode == 200 {
    err = json.Unmarshal(data, &thisMap)
    if err != nil {
        commons.ErrorLogger.Println(err.Error())
        return nil, &commons.RequestError{StatusCode: 400, Err: err}
    }
    return thisMap["data"][0], err
} else {
    return nil, &commons.RequestError{StatusCode: response.StatusCode, Err: errors.New("getting " + strconv.Itoa(response.StatusCode) + " From Data channel API")}
}
1 Answers

Postman has an option to convert request to programming language equivalent.

Here is a working go code for sending the request. package main

import (
  "fmt"
  "strings"
  "net/http"
  "io/ioutil"
)

func main() {

  url := "https://xxx.frappe.cloud/api/resource/Item?fields=%5B%22name%22,%22item_name%22,%22item_group%22,%22description%22%5D&filters=%5B%5B%22Item%22,%22item_group%22,%22=%22,%22xxx%20Product%22%5D%5D%0A"
  method := "GET"

  payload := strings.NewReader(`{
    "payload": {},
    "url_key": "",
    "req_type": ""
}`)

  client := &http.Client {
  }
  req, err := http.NewRequest(method, url, payload)

  if err != nil {
    fmt.Println(err)
    return
  }
  req.Header.Add("Content-Type", "application/json")
  req.Header.Add("Cookie", "full_name=foo; sid=secret_sid; system_user=yes; user_id=foobar; user_image=")

  res, err := client.Do(req)
  if err != nil {
    fmt.Println(err)
    return
  }
  defer res.Body.Close()

  body, err := ioutil.ReadAll(res.Body)
  if err != nil {
    fmt.Println(err)
    return
  }
  fmt.Println(string(body))
}
Related