【问题标题】:Guzzle 422 Unprocessable Entity errorGuzzle 422 无法处理的实体错误
【发布时间】:2014-12-24 01:37:22
【问题描述】:

我正在使用 browserstack screenshots API - https://www.browserstack.com/screenshots/api 以下 curl 正在工作:

curl -u "username:password" -H "Content-Type: application/json" -H "Accept: application/json"  -d '{"browsers": [{"os": "Windows", "os_version": "7", "browser_version": "8.0", "browser": "ie"}], "url": "http://google.com"}' http://www.browserstack.com/screenshots

但是,当我尝试使用 guzzle 进行相同的调用时,我收到 422 Unprocessable Entity 错误。

$client = new GuzzleHttp\Client();
$request = $client->post('http://www.browserstack.com/screenshots', [
        'headers' => ['Content-type' => 'application/json'],
        'auth' =>  ['username', 'password']
]
);

$data = ['browsers' => ['os' => 'Windows', 'os_version' => '7', 'browser_version' => '8.0', 'browser' => 'ie'], 'url' => 'http://google.com'];
$request->setBody($data);
$response = $request->send();
dd($response);

您能否建议如何调试此问题?

【问题讨论】:

    标签: php guzzle browserstack


    【解决方案1】:

    要将 JSON 发送到 Screenshots API,您需要将其格式化为 JSON 字符串。

    $client = new GuzzleHttp\Client();
    $request = $client->post('http://www.browserstack.com/screenshots', [
            'headers' => ['Content-type' => 'application/json'],
            'auth' =>  ['username', 'access_key'],
            'body' => '{"browsers": [
                               {"os": "Windows", "os_version": "7", "browser_version": "8.0", "browser": "ie"},
                               {"os": "android", "os_version": "4.4", "device": "HTC One M8", "browser": "Android Browser"}
                        ],
                        "url": "http://www.lipsum.com"}'
                ]
            );
    

    然后您就可以在BrowserStack Screenshots 页面上查看进度。

    有关如何使用 Guzzle 发送 POST 请求的指南,您可以参考此文档 — https://media.readthedocs.org/pdf/guzzle/latest/guzzle.pdf。

    【讨论】:

    • 您为我指明了正确的方向,感谢您提供的文档链接
    【解决方案2】:

    我的方法有误。它应该是 $client->createRequest 而不是 $client->post 另外,我在传递数据时出错。浏览器应该是数组数组

    还有一个可以与 browserstack 和 guzzle 一起使用的库:https://github.com/ksenzee/browserstack-screenshots-php

    $client = new GuzzleHttp\Client();
    
    $request = $client->createRequest('POST', 'http://www.browserstack.com/screenshots', [
            'headers' => ['Content-type' => 'application/json'],
            'auth' =>  ['user', 'pwd'],
            'body' => '{"browsers": [
                           {"os": "Windows", "os_version": "7", "browser_version": "8.0", "browser": "ie"},
                           {"os": "android", "os_version": "4.4", "device": "HTC One M8", "browser": "Android Browser"}
                    ],
                    "url": "http://www.lipsum.com"}'
    ]
    );
    $response = $client->send($request);
    dd($response->json());
    

    【讨论】:

      【解决方案3】:

      在我的例子中,在选项的参数 (https://es.stackoverflow.com/questions/185183/porqu%C3%A9-guzzle-5-0-lanza-el-error-422-si-estoy-armando-bien-la-consulta#185192) 中使用 'json',例如:

      $client = new GuzzleHttp\Client(['base_url' => 'http://www.browserstack.com/']);
      $request = $client->post('screenshots', [
          'headers' => ['Content-type' => 'application/json'],
          'auth' =>  ['username', 'access_key'],
          'json' => '{"browsers": [
                             {"os": "Windows", "os_version": "7", "browser_version": "8.0", "browser": "ie"},
                             {"os": "android", "os_version": "4.4", "device": "HTC One M8", "browser": "Android Browser"}
                      ],
                      "url": "http://www.lipsum.com"}'
              ]
          );
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-03-01
        • 1970-01-01
        • 2023-03-22
        • 1970-01-01
        • 2018-12-31
        • 1970-01-01
        • 2022-10-15
        • 1970-01-01
        相关资源
        最近更新 更多