Как передать apikey и другие ключи в header в guzzle 6.3? - PullRequest
0 голосов
/ 02 апреля 2020

У меня есть простая форма регистрации, которую пользователь может зарегистрировать в моем приложении, теперь я хочу отправить отправленные данные в другой сервис.

Сначала я проверяю свой запрос с помощью почтальона, используя следующую необработанную опцию в Панель почтальона.

Api url: app3.salesmanago.pl/api/contact/upsert

JSON DATA:
{
  "clientId":"w2ncrw06k7ny45umsssc",
  "apiKey":"ssssj2q8qp4fbp9qf2b8p49fz",
  "requestTime":1327056031488,
  "sha":"ba0ddddddb543dcaf5ca82b09e33264fedb509cfb4806c",
  "async" : true,
  "owner" : "adam@rce.com",
  "contact" : { 
        "email" : "test-1@konri.com",
        "name" : "Test",
        "address":{
            "streetAddress":"Brzyczynska 123",
      }
    }
}

ОБНОВЛЕНИЕ Я получаю следующий результат успеха

{
    "success": true,
    "message": [],
    "contactId": "b52910be-9d22-4830-82d5-c9dc788888ba",
    "externalId": null
}

Теперь с помощью guuzle htpp запрос в laravel

protected function create(array $data)
{
    $user = User::create([
        'name' => $data['name'],
        'email' => $data['email'],
        'password' => bcrypt($data['password']),
        ]);

        $client = new client();
        $current_timestamp = Carbon::now()->timestamp;
        try {
            $request = $client->post('app3.salesmanago.pl/api/contact/upsert', [
                \GuzzleHttp\RequestOptions::HEADERS      => array(
                    'debug'        => true,
                    'Accept'       => 'application/json',
                    'Content-Type' => 'application/json',
                    'clientId'     => 's255hncrw06k7ny45umc',
                    'apiKey'       => 'sj2q8rt5qp4fbp9qf2b8p49fz',
                    'sha'          => 'ba0br45543dcaf5ca82b09e33264fedb509cfb4806c',
                    'requestTime'  =>  $current_timestamp,
                    'owner'        => 'adwamtrw@fere.com',
                    'http_error'   => true
                ),

                \GuzzleHttp\RequestOptions::JSON => [
                    'form_params' => [
                        'name'  => $data['name'],
                        'email' => $data['email'],
                    ],
                ],
            ]);  
        }
        catch (GuzzleHttp\Exception\ClientException $e) {
            $response = $e->getResponse();
            $responseBodyAsString = $response->getBody()->getContents();
        }
        $status = $request->getStatusCode();
        $response = $request->getBody();
        $r = json_decode($response);
        dd($r);
        dd($status, $r );
    return $user;
}

Когда я запускаю свое приложение и отправляю данные формы, я получаю это, используя те же данные, что и в почтальоне, я получаю это

{#306 ▼
  +"success": false
  +"message": array:1 [▼
    0 => "Not authenticated"
  ]
  +"contactId": null
  +"externalId": null
}

Кажется, что мой Ключ API и другие данные заголовка не передаются в заголовок должным образом,

Может кто-нибудь сказать мне, что я здесь не так делаю?

Ответы [ 2 ]

2 голосов
/ 02 апреля 2020

Может быть, что-то вроде этого. Обратите внимание, что согласно API некоторые значения должны передаваться как заголовки (Accept и Content-Type - обычно используются как заголовки, btw-), а другие значения - как часть тела. Это случай значений аутентификации, таких как clientId и apiKey.

У меня не установлено приложение guzzle 6, но вы можете попробовать изменить код так, чтобы он включал эти данные не в раздел заголовков запроса, а в тело:

$request = $client->post('app3.salesmanago.pl/api/contact/upsert', [
        \GuzzleHttp\RequestOptions::HEADERS      => array(
            'debug'        => true,
            'Accept'       => 'application/json',
            'Content-Type' => 'application/json',
        ),

        \GuzzleHttp\RequestOptions::JSON => [
            'form_params' => [
                'name'  => $data['name'],
                'email' => $data['email'],
                'clientId'     => 's255hncrw06k7ny45umc',
                'apiKey'       => 'sj2q8rt5qp4fbp9qf2b8p49fz',
                'sha'          => 'ba0br45543dcaf5ca82b09e33264fedb509cfb4806c',
                'requestTime'  =>  $current_timestamp,
                'owner'        => 'adwamtrw@fere.com',
                'http_error'   => true
            ],
        ],
    ]);

Я не уверен насчет «form_params» в RequestOptions::JSON, но, возможно, вы можете поместить значения непосредственно в RequestOptions::JSON.

1 голос
/ 02 апреля 2020

Просто к вашему сведению, не знаю, какой Laravel вы используете, но теперь есть Laravel HTTP-клиент , который значительно упрощает эту задачу.

$response = Http::withHeaders([
                'Accept' => 'application/json, application/json',
                'Content-Type' => 'application/json',
                'clientId' => 'dd2ncrw06k7ny45umce',
                'apiKey' => 'ddjdd2q8qp4fbp9qf2b8p49fdzd',
                'sha' => ' wba0b543dcaf5ca82b09e33264fedb4509cfb4806ec',
                "requestTime" => $current_timestamp,
                "owner" => "testemail@wp.com",
])->post('app3.salesmanago.pl/api/contact/upsert', [
    'name' => $data['name'],
    'email' => $data['email'],
]);

if($response->successful()){
 dd($response->json())
}else{
  // handle yo errors
}
...