Freshdesk API Создать заметку с ошибкой проверки вложения - PullRequest
0 голосов
/ 05 мая 2020
use GuzzleHttp\Client;

function insert_freshdesk_note($ticketId, $content, $attachments=null)
{
    if(is_null($content)) {
        return false;
    }

    $url = 'https://mydomain.freshdesk.com/api/v2/tickets/'.$ticketId.'/notes';
    $method = 'POST';
    $userName = config('freshdesk_api_key');
    $password = 'password';

    $data = (!empty($attachments)) ? [
        "attachments[]" => $attachments,
        "body" => $content,
        "private" => false,
    ] : [
        "body" => $content,
        "private" => false,
    ];

    $options = (!empty($attachments)) ? [
        'json' => $data,
        'auth' => [$userName, $password],
        'headers' => ['content-type' => 'multipart/form-data']
    ] : [
        'json' => $data,
        'auth' => [$userName, $password]
    ];

    $client = new Client();

    try {
        $response = $client->request($method, $url, $options);
        return json_decode($response->getBody(), true);
    } catch (Exception $e) {
        Log::error($e);
    }
}

Приведенный выше код работает нормально без вложений, но когда вложение появляется на картинке, выдает следующую ошибку: -

GuzzleHttp\Exception\ClientException: Client error: `POST https://mydomain.freshdesk.com/api/v2/tickets/13033/notes` resulted in a `400 Bad Request` response:
{"description":"Validation failed","errors":[{"field":"{\"attachments","message":"Unexpected/invalid field in request","

Я работаю в соответствии с документацией, и я упал конец с этого момента. Я пробовал другие перестановки и комбинации, но с их помощью я не смог решить эту проблему.

Кто-нибудь может мне помочь. Вот ссылка на документацию freshdesk И в $ attachments [] = '@ / path / to / xyz.ext' это конкретное происходит.

Вызов функции будет go вот так: -

insert_freshdesk_note($this->freshdesk_ticket_id, $noteText, $image->image_full_path);

1 Ответ

0 голосов
/ 05 мая 2020

В приведенном выше вопросе я пытался добиться добавления примечания с помощью клиента GuzzleHTTP, Laravel Framework и PHP языка. Вот следующий исходный код, с помощью которого он начинает работать.

use GuzzleHttp\Client;

function insert_freshdesk_note($ticketId, $content, $attachments=null)
{   
    if(is_null($content)) {
        return false;
    }

    $url = 'https://mydomain.freshdesk.com/api/v2/tickets/'.$ticketId.'/notes';
    $method = 'POST';
    $userName = config('freshdesk_api_key');
    $password = 'password';

    $attachmentsFilePath = explode('/',$attachments);
    $fileName = end($attachmentsFilePath);

    $options = (!empty($attachments)) ? [
        'multipart' => [
            [
                'name'     => 'body',
                'contents' => $content,
            ],
            [
                'name'     => 'private',
                'contents' => "false",
            ],
            [
                'name'     => 'attachments[]',
                'contents' => fopen($attachments, 'r'),
                'filename' => $fileName,
            ],
        ],
        'auth' => [$userName, $password],
    ] : [
        'json' => [
            "body" => $content,
            "private" => false,
        ],
        'auth' => [$userName, $password]
    ];

    $client = new Client();

    try {
        $response = $client->request($method, $url, $options);
        return json_decode($response->getBody(), true);
    } catch (Exception $e) {
        Log::error($e);
    }
}

Мы должны отправлять данные в многостраничном режиме, чтобы серверная часть Freshdesk понимала, что данные присутствуют, путем записи multipart / form-type в заголовок не поможет. Если вы посмотрите документацию также с приложениями и без них: -

Без вложений: -

curl -v -u user@yourcompany.com:test -H "Content-Type: application/json" -X POST -d '{ "body":"Hi tom, Still Angry", "private":false, "notify_emails":["tom@yourcompany.com"] }' 'https://domain.freshdesk.com/api/v2/tickets/3/notes'

С вложениями: -

curl -v -u user@yourcompany.com:test -F "attachments[]=@/path/to/attachment1.ext" -F "body=Hi tom, Still Angry" -F "notify_emails[]=tom@yourcompany.com" -X POST 'https://domain.freshdesk.com/api/v2/tickets/20/notes'

Разница в завитке можно увидеть. Это был недостающий элемент, который я не заметил.

...