Дротик и облако частиц - PullRequest
       12

Дротик и облако частиц

0 голосов
/ 07 апреля 2020

Я создаю флаттер-приложение, которое взаимодействует с устройством Particle Photon через Particle Cloud, и у меня возникают проблемы с выполнением правильно отформатированного запроса к облаку Particle.

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

void setStatus(int idx) async {
  print('ParticleService: setStatus($idx)');
  var url = particleHost + _deviceID + particleVerb1;
  var formData = 'access_token=$_accessToken&params=$idx';
  var bodyLen = formData.length;
  var headers = {
    "Content-Type": "application/x-www-form-urlencoded",
    "Content-Length": "$bodyLen"
  };
  var response = await http.post(url, body: formData, headers: headers);
}

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

Response body: {"error":"invalid_request","error_description":"The access token was not found"}

Когда я пытаюсь отправить токен доступа в заголовке авторизации, он выглядит следующим образом:

    var url = particleHost + _deviceID + particleVerb1;
    var body = json.encode({"params": "$idx"});
    var bodyLen = body.length;
    var headers = {
      HttpHeaders.authorizationHeader: _accessToken,
      HttpHeaders.contentTypeHeader: 'application/json',
      "Content-Length": "$bodyLen"
    };

    print('URL: $url');
    print('Body: $body');
    print('Headers: $headers');

    var response = await http.post(url, body: body, headers: headers);

Облако частиц отвечает, что заголовок аутентификации malformed:

Response body: {"error":"invalid_request","error_description":"Malformed auth header"}

Я делал это много раз раньше, и это работало нормально, но что-то в реализации Flutter меня убивает. Вот это в TypeScrtipt в приложении Ioni c:

  setStatus(currentStatus: number): Promise<any> {
    console.log(`ParticleService: setStatus(${currentStatus})`);

    const url: string = PARTICLE_HOST + this.deviceID + PARTICLE_VERB_1;
    const body = `access_token=${this.accessToken}&params=${currentStatus}`;
    const headers: any = {
      'Content-Type': 'application/x-www-form-urlencoded',
      'Content-Length': body.length
    };

    return new Promise((resolve, reject) => {
      this.http.post(url, body, { headers }).subscribe(data => {
        resolve(data);
      }, error => {
        console.error(error.message);
        reject(error.message);
      });
    });
  }

Вот оно в JavaScript для браузера:

console.log(`setRemoteStatus(${btnName})`);
        // Get the color code based on the status being set
        let colorCode = buttons.indexOf(btnName);
        // Build the URL we'll use to talk to the Particle API
        let postURL = particleHost + particlePath + config.getDeviceID() + particleVerb1;
        // Craft the POST request body
        let postBody = `access_token=${config.getAccessToken()}&params=${colorCode}`;
        // Call the API
        fetch(postURL, {
            method: 'POST',
            mode: 'cors',
            headers: {
                'Content-Type': "application/x-www-form-urlencoded",
                "Content-Length": postBody.length
            },
            referrerPolicy: 'no-referrer',
            body: postBody
        }).then(res => {
            if (res.status == 200) {
                displayAlert('Status Update', 'info', 'Successfully set remote status', 500);
            } else {
                displayAlert('Update Error', 'warning', `Status not set (result code ${res.status})`);
            }
        }).catch(err => {
            console.error('Unable to set status');
            displayAlert('Update Error', 'error', `Unable to set status (${err.message})`);
        });

Может кто-нибудь, пожалуйста, помогите мне понять, где я я ошибаюсь в коде Дарт?

1 Ответ

0 голосов
/ 07 апреля 2020

Измените setStatus на это:

Future<void> setStatus(int idx) async {
  print('ParticleService: setStatus($idx)');
  var url = particleHost + _deviceID + particleVerb1;
  var formData = <String, String>{
    'access_token': _accessToken,
    'params': idx.toString(),
  };
  var response = await http.post(url, body: formData);
}

Не пытайтесь кодировать тело самостоятельно, когда post сделает это за вас, если вы дадите ему Map<String, String>. (Он также устанавливает тип и длину контента для вас. Если вам нужно добавить другие заголовки, вы можете заново установить карту headers, но это не нужно, если вам просто нужны два заголовка контента.)

...